- стр. 1 -

КЛЮЧЕВАЯ   СТРАНИЦА   КУРСА

 Прочитайте, сохраните и знайте !

- Как воспользоваться этим курсом ?
- Как распорядится его ресурсами правильно ? 

- Где и какую искать информацию ?
- Где найти схемы и программы 
- Где купить МК и электронные компоненты ?
-
Как сделать электронное устройство ?
- Пример:
Что можно взять полезного из АпНоута.


 

Что делать если вы не сильны в Электронике?

Если мало знаний по электронике, но есть желание что-то сделать - то главное у Вас уже есть! Человек умеющий читать, может все ! 

Для вас Книги по электронике

Особенно рекомендую начинающим книги по основам электроники и схемотехники:  

Настольная книга электронщика:  

 По ходу работы ОБЯЗАТЕЛЬНО:

Вам ПОКА не нужно покупать МК, радиодетали и паять что либо ! 

PTOTEUS -  очень мощный, серьезней пакет не только симулирования чего душа пожелает (аналоговая, цифровая, микроконтроллеры, PLD) Hо и для проектирования электроники от идеи до файлов для изготовления печатной платы ! Протеус является ещё и прекрасным интерактивным справочником по электронным компонентам !  в PTOTEUS вы можете увидеть как МК работающий по вашей программе "общается" с электродвигателями, с шаговыми моторами, с серво, с картами памяти, с жестким диском, сможете даже сыграть с МК в шахматы !  в симуляторе PTOTEUS вы можете симулировать в одной схеме работу нескольких разных МК одновременно ! причем это могут быть МК разных семейств - AVR,  PIC, 8051, ARM7, Motorola MC68HC11.

 Как сделать электронное устройство.

Прежде чем "изобретать велосипед",  т.е. делать свой вариант какого либо устройства ( и не только электронного ! ) которое наверняка целиком или частично уже было сделано  многими людьми и даже трудовыми коллективами - разумно поискать и посмотреть результат их труда и использовать его по максимуму ! ОБЯЗАТЕЛЬНО  ИЩИТЕ существующие аналоги того, что вы хотите сделать  

Ищите источники  схемотехнических, алгоритмических, программных аналогий. Анализ того что сделано другими поможет 
вам избежать многих досадных ошибок и  тупиковых решений.
Отправной точкой в поиске может быть сайт компании Телесистемы.  
Эта компания производит множество устройств на МК - схемы этих устройств выложены на их сайте и доступны для скачивания. Там же есть очень полезный раздел: проекты на микроконтроллерах на русском языкеэто читатели сайта   и самой "живой" русскоязычной МК конфы (доброжелательная атмосфера, быстрые ответы даже на "дурацкие" вопросы ламеров, полезная информация - уже более 1300 страниц архива конференции!) публикуют свои разработки там схемы и даже прошивки к большинству из них.
Скорее всего вы найдете то что хотите сделать ! Либо почти "то" и вам останется лишь немного подправить схему или программу под свою задачу.

Возможно вам будет проще найти и использовать подходящий электронный набор MasterKit или Velleman - очень большой перечень устройств - цена умеренная В любом случае там вы можете взять схему и принцип работы устройства, а иногда и прошивку.

Методика работы с МК

Методика работы с МК - как и с ЛЮБЫМИ электронными компонентами, такова - Hаходите на сайте производителя или на  AllDataSheet  или в google.com и скачивайте: 

Пример: Что можно взять полезного из АпНоута.

Вот тут найдите ( пример применения = АпНоут = application note ) AVR492: "Brushless DC Motor control using AT90PWM3"  

Скачайте документ doc7518.pdf и архив avr492.zip с кодом программ для МК.

 

 

 

 

BLDC motor   -  дословно переводится как Бес Щеточный Постоянного Тока мотор. По-русски ВЕНТИЛЬНЫЙ электродвигатель. Однако питать его постоянным током нельзя - сгорит !  Его нужно питать 3х-фазным переменным напряжением с фазой зависящей от положения ротора ! Рассматриваемое устройство как раз преобразует постоянное  напряжение в 3-х фазное переменное. Подробно и главное понятно про электропривод читайте на  stepmotor.ru  -  там же можно купить электро-мотор-редукторы и шаговые двигатели. 

 

 

 

 

AN492 "Контроллер вентильного двигателя  на МК AVR AT90PWM3"  

 Повторяю!   Некоторые АпНоуты по электроприводу с AVR440 по AVR495 любезно переведены на русский и доступны на великолепном сайте - GAW.ru

Открываем документ - doc7518.pdf и видим :

На плате устройства можно увидеть 
- как правильно располагать электронные компоненты, 
- какие они бывают, 
- как выглядят, 
- как правильно конструировать плату. 

 

 

- Далее идут листы с частями схемы устройства - схемы сложных устройств иногда удобней разбить на функциональные блоки и рисовать на отдельных листах : 

Посмотрите схемы и попробуйте найти компоненты на плате устройства, отследить печатные проводники на плате - в общем поработайте с информацией себе на благо!

 1) Лист 2/4 схема POWER - стабилизатора питания МК - готовый вариант для вашего устройства ! ИСПОЛЬЗУЙТЕ !  

Микросхема U6 стабилизатор питания MC78M05 (корпус Dpak ищи и смотри ДШ на MC78M05 - черный квадратный прибор под алюминиевым бочонком) -  дает стабилизированные 5 вольт для питания МК из 12 вольт (это здесь, а вообще диапазон входного напряжения может быть шире) от внешнего источника питания устройства. 

Вот интересно - диод D5 (вертикальный цилиндрик на плате вверху под зелеными клеммами) с конденсатором C19 (алюминиевый бочонок чуть ниже диода) позволяет МК получать непрерывное питание 5 вольт даже при кратковременном обнулении входного напряжения - такое очень возможно при коммутации мощного эл. двигателя, еще при этом возникают значительные импульсные помехи в проводе питания - их гасят конденсаторы C18 C19 C20  и резистор  R25 значительно повышает эффективность конденсаторов C19 C20 в подавлении помех от источника питания.   

Резистор  R25 еще защищает стабилизатор MC78M05  от короткого замыкания выхода +5 вольт на землю - он ограничивает ток. 

Светодиод D6 (smd корпус - белый прямоугольничек под стабилизатором MC78M05 ) индицирует наличие +5 вольт питания МК - это очень удобно и правильно!  

 

 

 

 

ВАЖНО ! Необходимыми для питания устройства  являются лишь 3  элемента - стабилизатор и по одному конденсатору на его входе и выходе.  Но компонентов значительно больше - это сделано для обеспечения надежной работы устройства.  Не поддавайтесь копеечной экономии и обманчивой простоте "ведь работает же" - это не критерий ! Устройство должно работать надежно ! 

 

 

 

 

 2) Правее можно увидеть схему интерфейса LIN - он очень широко применяется в автомобилестроении и в других местах с сильным уровнем помех и позволяет передавать сообщения по последовательному протоколу (хорошо совместим с USART и UART) между устройствами с соединенными "землями" по одному сигнальному проводу со скоростью до 20 Кбит в секунду. 

3) на странице схемы 3/4 изображен МК. 

Есть несколько интересных моментов:
 
Питание на МК (вывод VCC) и на встроенный в МК АЦП (вывод AVCC) подается через резистор 10 Ом и эти выводы зашунтированы 10 нФ конденсаторами  на землю устройства  - это сделано для фильтрации (ослабления) высоко частотных и импульсных помех наводящихся на цепи питания устройства. 

Лучший результат можно получить поставив вместо резисторов индуктивности по 60-100 нГн а совсем уж крутизна применить специальные проходные фильтры для питания, например Murata

К выводу опорного напряжения АЦП МК (вывод AREF) подсоединен лишь конденсатор 100 нФ на землю для снижения пульсаций напряжения - очевидно используется внутренний источник опорного напряжения - такой имеется и у МК ATmega - на 2,56 вольт.

Обратите внимание на разъем J2 JTAG-ISP - этот разъем позволяет прошить МК прямо в системе (с помощью ISP адаптера)  и проводить отладку и мониторинг работы программы МК прямо в готовом устройстве по интерфейсу JTAG

 4) На странице схемы 4/4 изображен мощный драйвер для 3-х фазного электро-мотора. Сделан ОЧЕНЬ ПРАВИЛЬНО - надежно! 

Оставив 4 транзистора из 6-ти вы получите классический Н-мост (H-bridge) и с его помощью можете управлять обычным коллекторным (щеточным) электродвигателем постоянного тока - DC motor.

Есть АпНоуты и по управлению Сервоприводом и Коллекторными двигателями и Асинхронными моторами и Шаговыми моторами.

- полевые транзисторы-ключи SUD35N05-26L  (6 черных квадратиков справа на плате) управляются МК через специальные драйверы IR2184 для полевых транзисторов. 

 

 

 

 

Драйверы IR2184 обеспечивают правильные сигналы на затворах полевых транзисторных ключей гарантирующие полное и быстрое их открытие и быстрое закрытие - это снижает выделение тепла на транзисторах.

Кроме того автоматически формируют паузу между открытым состоянием нижних и верхних транзисторов одного плеча моста. Одновременное открытое состояние транзисторов вызовет протекание "сквозного тока" от источника питания через оба транзистора ! А "по жизни" ток должен протекать через нагрузку.

Используйте драйверы аналогичные  IR2184  - это ПРАВИЛЬНО !

 

 

 

 

 
- интересный узел и очень полезный  - 
часто используется во многих устройствах обеспечивая безотказность их работы :

Измеритель суммарного тока протекающего через драйвер и двигатель - схема его стандартна - 3 транзистора нижнего плеча в драйвере подсоединены к одному проводу, не к "общему" проводу устройства !  А этот провод через токоизмерительный резистор R18 (беленький прямоугольник справа внизу на плате с надписью R100 - значит 0.1 Ом) подключен к "земле" устройства.  

Протекание тока I через резистор R вызывает падение напряжения U на нем :

U = I * R         ( это закон Ома для участка цепи )

это напряжение фильтруется ФНЧ (фильтром нижних частот) образованным R20 и C16 и подается на компаратор  LMV7219M5 - он сравнивает его с напряжением заданным с помощью ЦАП  (сигнал DAC_OUT) и в случае превышения на выходе компаратора возникает высокий уровень over_cur - означающий превышение током заданного значения. 

Обычно делают проще -  используют не компаратор
а ОУ (операционный усилитель) и без сравнения с чем либо усиливают напряжение с R18 (нормируют сигнал) и подают на АЦП. Программа МК по результату АЦП судит о величине тока. 

Однако примененная схема с компаратором (его роль может выполнять и ОУ) позволяет быстрее реагировать на превышение тока выше заданного значения - ведь сигнал с компаратора можно подать на один из входов INTx  - это ножки МК имеющие возможность прерывать программу МК по внешнему событию. МК при возникновении такого прерывания примет меры для снижения тока - обычно это делается путем изменения величины ШИМ сигнала управляющего "мостом".

Обратите внимание! Для защиты драйверов IR2184 по питанию - предусмотрен защитный диод TVS SMBJ18 - но на плате его нет.  

 

 

 

 

 

Очень советую ! При проектировании схемы и разводке платы предусматривайте все по максимуму ! а напаять в устройстве можно лишь необходимое. Зато вам будет легко добавить то, что было задумано - ведь место на плате будет предусмотрено заранее !

 

 

 

 

 В АпНоуте AVR492 еще много информации к размышлению  и применению и еще есть архив с программой для МК !  

Пожалуйста найдите время и просмотрите!

Советую читать курс с начала !

  
Я считаю, что МК это микросхема (чип, камень, IC) - которая в ответ на внешние электрические сигналы действует в соответствии с :

Возможность МК действовать по вашей программе - вот суть-соль МК.  Это главное отличие МК от "обычных" НЕ программируемых  микросхем.

Что такое  AVR ?

Это семейство МК (Таблица всех МК AVR) от компании ATMEL разработанных
с учетом особенностей и удобства написания программ на языке Си.

Книги и учебники по  AVR тут

Почему  AVR ?

Это не дорогие, широко доступные, надежные, простые, довольно быстро считающие  большинство инструкций выполняется за 1 такт - т.е. при кварце 10 МГц выполняется до 10 млн. инструкций в секунду ! 

AVR имеют развитую периферию, т.е. набор аппаратуры окружающей процессор-вычислитель в одном корпусе МК или набор встроенных в МК электронных устройств, блоков, модулей. 

Вот основные параметры AVR:

Существуют AVR-ы со встроенными интерфейсами USB, CAN и со встроенными радио приемо-передатчиками.Есть специализированные МК AVR для управления электроприводом электродвигателями - серия AT90PWMxxxx

Очень важный, Добрый совет вам : 

Вы начинающий и наверно благоразумно не планируете делать сразу серийное коммерческое устройство, а хотите использовать МК для любительских штучных изделий, Используйте в ваших устройствах какой-то один  и тот же "многоногий" МК AVR серии ATmega Желательно один из этих: 

- они позволяют выполнить любую задачу любительского уровня (и многие 
  задачи профессионального уровня - это же серийный МК)  
- они поддерживаются симуляторами электронных устройств на AVR - VMLAB (о нем чуть позже и подробней) и супер-пупер симулятором PTOTEUS  (он кстати  позволяет симулировать  и другие МК семейств PIC, 8051, ARM7, Motorola). 
- они имеют достаточно оперативной памяти и памяти для вашей программы  
- они имеют много выводов (ножек) - это очень удобно !
- они имеют встроенный RC генератор и могут работать без внешнего кварца - достаточно подать питание на новый МК и он "затикает" !

  Используйте один и тот же МК и он станет вам "своим в доску" . Вы сможете: 

Вам будет ОЧЕНЬ удобно работать a это важно для уверенного старта. Вы будете знать всего один МК , но будете знать его очень хорошо !  

Не бойтесь многоногих ATmega с большим количеством "периферии"  (встроенных в МК, полезных, но возможно не нужных вам пока устройств с непонятными названиями).   Все они изначально - "по умолчанию" обычно отключены и о них можно не думать. Вам нужно будет позаботится о включении и конфигурации только 
тех из них, которые понадобятся вам а вашем устройстве.Забегая вперед скажу что сделать это очень просто благодаря встроенным в компиляторы CVAVR и ICC  интерактивным визадам мастерам начальной конфигурации МК и создающим начальный текст программы.
     Если вы хотите только помигать для начала светодиодом
- то даже на ATmega128 вам нужно всего лишь подключить к МК :

Вас совершенно не тронет и не напряжет та "навороченность" что заложена в ATmega128. Она будет тихо ждать пока вы ее не затребуете!

Четкое понимание алгоритма работы устройства это основа - базис для успешной разработки самого устройства и программы для МК ! 

Микроконтроллер  AVR  ATmega  - ключевые моменты устройства 

Напомню: Самая подробная и полная информация по МК содержится КОНЕЧНО же в его ДШ.Он доступен в оригинале и на русском языке.  

Подробнее об основах и тонкостях устройства МК AVR и работе с ними читайте в книгах :  

об основах и тонкостях электроники и схемотехники читайте в настольной книге электронщика:  П.Хоровиц, У.Хилл. Искусство схемотехники - общепризнанная 
библия электронщика на РУССКОМ языке. Уже 5-е издание.

Я уже предупреждал вас выше: МК является микросхемой которая в ответ на внешние электрические сигналы действует в соответствии с возможностями заложенными производителем, электроникой подключенной к МК, программой которую в него загружена, например вами. Разберем по пунктам: 

Внешние электрические сигналы 

Это напряжения и токи поступающие к МК от подключенных к нему проводниками других компонентов электронного устройства. Важнейший из них - это напряжение питания МК. МК AVR серии ATmega могут работать, т.е. исполнять заложенную в них программу уже при подаче одного напряжения питания, а узнать о том что он работает мы можем по изменению тока потребляемого МК по проводу питания. 
   Диапазон допустимых напряжений питания указан на первой странице ДШ 
и составляет обычно 4.5 - 5.5 вольт постоянного напряжения - плюс которого подключается к выводам  VCC   МК. 
  Для МК ATmaga с буквой L в названии диапазон питания 2.7 - 5.5 вольт - он шире (достаточно литиевой батарейки или двух пальчиковых) но зато максимальная частота тактирования МК в 2 раза ниже и обычно составляет 8 МГц.  
   Отрицательный вывод источника питания подключается к выводам МК  GND и его потенциал принимается за ноль вольт и относительно него измеряются все другие напряжения на ножках МК. 
   Проводник соединенный с выводами GND МК называют общим или нулевым или "земля" и на схеме обозначают специальным символом - например жирной горизонтальной черточкой или несколькими горизонтальными полосками друг под другом убывающей длины.

  Электрические сигналы это  токи  и вызываемые их протеканием  напряженияНо говоря о сигналах поступающих в МК мы рассматриваем их как некоторые напряжения измеряемые относительно ножек GND МК. Любой электрический сигнал является аналоговым  т.е. имеет определенное значение в каждый момент времени и если он был 2 вольта а стал 4 вольта то он обязательно принимал все значения лежащие
между 2-мя и 4-мя вольтами.

( ВАЖНО ! )В цифровой технике приняты некоторые правила по которым можно представить аналоговый сигнал допустимый для подачи на ножку МК (он должен быть выше -0.5 вольт и ниже чем напряжение питания МК увеличенное на 0.5 вольта, я советую 0.3 вольта ) как 1-битный цифровой сигнал или как одно из двух значений: 

Эти правила для ножек МК которые могут быть входами (и кроме XTAL1 и RESET) 
в МК AVR описаны в разделе ДШ "Electrical Characteristics" и иллюстрированы графиками :  

 

График 181 из ДШ на МК ATmega16 

Показывает зависимость порогового (Threshold) напряжения переключения из "0" в "1" от напряжения питания МК.

 


Очень важно правильно понять этот график ! 

   Он означает следующее:  Если МК считал напряжение на ножке (левая вертикальная шкала графика) логическим нулем и это напряжение было ниже линии графика, то при достижения напряжением на ножке этой линии графика - МК начинает считать что теперь на ножке присутствует логическая единица - "1". Значит теперь в регистре PINX порта_Х которому принадлежит эта ножка соответствующий ей бит стал "1" - единицей (а был "0" - нулем) Это типовое значение !  т.е. наиболее вероятное для вашего МК.  По графику при напряжении питания МК 5 вольт этот порог примерно 1.9 вольт в диапазоне температур от -40 до 85 градусов.
   Но есть еще и гарантированное значение напряжения при превышении которого МК будет считать, что на ножке появилось напряжение соответствующее логической единице. Оно равно 60% от напряжения питания МК - для 5 вольт это будет 3 вольта.

Запомните !  Что бы быть уверенным что МК AVR (питающийся от 5 вольт) воспримет входной сигнал (входное напряжение) как "1" вы должны позаботится о том что бы это напряжение  было не ниже чем 3 вольта !  Уточняйте в разделе ДШ "Electrical Characteristics" для вашего МК !

 

График 182 из ДШ на МК ATmega16 

Показывает зависимость порогового (Threshold) напряжения переключения из "1" в "0" от напряжения питания МК.

 

Он означает следующее:  Если МК считал напряжение на ножке логической единицей и оно было выше линии графика, то при снижении напряжения на ножке МК до линии графика - МК начинает считать что теперь на ножке присутствует логический ноль - "0". Значит теперь в регистре PINX порта_Х которому принадлежит эта ножка соответствующий ей бит стал "0" - нулем - НЛУ (а был "1" - ВЛУ)

Это типовое значение !  т.е. наиболее вероятное для вашего МК. 
По графику при напряжении питания МК 5 вольт этот порог примерно 1.3-1.4 вольта в диапазоне температур от -40 до 85 градусов.

Но опять существует  гарантированное значение напряжения ниже которого МК будет считать, что на ножке появилось напряжение соответствующее логическому нулю.  Оно равно 20% от напряжения питания МК - для 5 вольт это будет 1 вольт. Что бы быть уверенным что МК ATmega16 (питающийся от 5 вольт) воспримет входной сигнал (входное напряжение) как "0" вы должны позаботится о том что бы это напряжение  было не выше 1 вольта !   

Запомните: 

   Возникает вопрос - а чем будет считать МК сигнал 1.7 или скажем 1.46 вольта ? т.е. как МК интерпретирует напряжение на ножке между рассмотренными выше пороговыми уровнями ?  Это зависит от того чему был равен соответствующий этой ножке бит в регистре PIN_X (т.е. от того каким ЛУ считал МК напряжение на ножке) до появления напряжения попадающего между двумя порогами переключения  - и по приведенным выше двум правилам - этот бит не может изменится !
   Важный вывод
- любое изменение напряжения на ножке МК лежащее между двумя пороговыми напряжениями не ведет к изменению того каким логическим уровнем считает МК напряжение на этой ножке в данный момент !  

   Внимательно прочитайте и поймите, запомните - все входные сигналы с ножек МК поступают на встроенные триггеры Шмитта (аналогичные двум последовательно включенным элементам микросхемы 74HC14) - это устройства имеющие гистерезис (иначе - разность напряжений) по входному напряжению переключения их выходов из "1" в "0" и наоборот. 

По графику 183 в AVR гистерезис составляет примерно 0.57 вольта  при VCC 5 вольт 

 

Г  истерезис по входному напряжению позволяет отсечь помеху (существующую во входном сигнале и/или наводку - напряжение создаваемое внешними электромагнитными полями в проводнике подводящем сигнал ко входу приемника - в нашем случае к ножке МК) с размахом до величины гистерезиса и четко распознать преобразовать в логические единицы и нули зашумленный цифровой сигнал.

Если подключить двух лучевой осциллограф ко входу и выходу триггера Шмитта и подать на его вход смесь цифрового сигнала размахом 4-5 вольт и шумового сигнала размахом чуть меньше гистерезиса - мы увидим следующую картину: На входе тригера Шмитта будет черти что в котором будет угадываться цифровой сигнал а на выходе будет чистенький прямоугольный цифровой сигнал !(Вы можете смоделировать это в PROTEUS или в MicroCAP)

Подробнее об основах и тонкостях электроники и схемотехники читайте в книге оглавление которой на заглавной странице.

Теперь вы знаете как AVR преобразует напряжения на его ножках в "1" или "0" 


МК внешние сигналы : 

1)  сигнал сброса RESET - при "0" на этой ножке МК останавливает выполнение программы, содержимое регистров МК становится начальным (см. таблицу регистров в конце ДШ - в основном все биты нули) а все выводы становятся высокоомными входами (говорят: Z - состояние).  

После появления на этой ножке "1" и наличии питания МК - выполнение программы начнется с начала, как после включения питания МК    Подробней см.  в разделе "Resetting the AVR" ДШ.  Эту ножку можно ни куда не подключать благодаря внутреннему резистору "подтягивающему" ( подающему ток от источника более высокого напряжения) ее к питанию МК, но я бы посоветовал не оставлять reset в воздухе а "заземлить" конденсатором 0.1 мкФ - а еще лучше и подключить к  reset диод типа 4148 черточкой к + питания МК и параллельно диоду резистор 5-12 КОм.

Запомните:

2) питание аналоговой части МК, АЦП (входы ADC_x ) ножка AVCC - ее нужно соединить с выводом VCC питания МК даже если вы не предполагаете использовать АЦП.

3) опорное напряжение для АЦП  (входы ADC_x ) ножка AREF - напряжение на ней должно быть от 2 вольт до напряжения питания МК.  Напряжение на входах АЦП равное или превышающее AREF  будет оцифровываться в код 1023 (давать результат АЦП равный 1023.   Всегда желательно заземлять эту ножку конденсатором на 0.1 мкФ.     Вы можете использовать внутренний источник опорного напряжения на 2,56 вольт. (МК AVR ATmega имеет встроенный 8-ми канальный (АЦП) Аналого Цифровой Преобразователь  -  он позволяет преобразовать напряжение на ножках МК подключаемых к АЦП в число от 0 до 1023  - т.е.  в 10 битный результат.)

4) ножки для подключения кварца или керамического резонатора XTAL1 XTAL2. Для работы МК необходимритм или тактирование.   Нужен некоторый периодический сигнал в соответствии с которым МК сможет шагать по заложенной в него программе, кроме того тактовый сигнал нужен для работы периферии МК. Хотя МК ATmega имеют встроенный источник тактовой частоты RC-генератор (с завода он включен на частоту 1 МГц обычно) и к этим выводам можно ни чего не подключать, чаще требуется более точный источник тактирования - наиболее популярный это кварц - правильнее кварцевый резонатор - его подключают между этими ножками МК, а с самих ножек подключают конденсаторы 22-33 пФ на землю. 
  Важно установить фьюзы (Fuses) в соответствии с параметрами нужного вам тактового сигнала и его источника. Читайте раздел ДШ "Sestem clock and Clock options" и таблицу 2. "device clocking options select" . FUSE (фьюз)
- Это в общем то обычный бит в регистрах фьюзов но программа МК не может их изменить. Вы можете менять их только программатором.

С завода МК поставляется с определенной комбинацией фьюзов - все указано в ДШ. Будьте внимательны с фьюзами! Прежде чем менять фьюзы определите точно что вы делаете, иначе вы можете по ошибке отключить режим ISP программирования и МК можно будет перепрограммировать только специальным программатором. Список фьюзов для каждого МК удобно смотреть и устанавливать их состояние в диалоге настройки программирования компилятора CodeVisionAVR.

Вот список комбинаций состояний фьюзов для МК ATmega128 с кратким описанием их назначения:


Не пугайтесь! В большинстве МК их гораздо меньше. 

МК ATmega16 поставляется с такой комбинацией 6-ти фьюзов относящейся к
источнику тактового сигнала - абзац "Default Clock Source" :  

SKSEL 0001     SUT 10   

Это означает - включен внутренний  источник тактовой частоты - RC-генератор
и генерируемая частота 1 МГц. Подробней о фьюзах на стр. 7 курса.  О фьюзах AVR рассказано и внизу этой страницы.

По умолчанию в МК включен интерфейс JTAG - поэтому 4 ножки в PORTC не доступны для обычного использования. Чтобы отключить JTAG нужно изменить фьюз JTAGEN в "1". JTAG можно выключить и программно - для этого нужно два раза подряд вписать "1" в бит JTD  в регистре MCUCSR в течении 4 тактов МК. Чтобы опять включить JTAG  нужно два раза подряд вписать "0" в бит JTD

Ножки - выводы МК - какие они бывают.

   Если вам нужно тактировать МК внешним сигналом (например от другого МК в системе или какой либо микросхемы имеющий собственное тактирование) то его нужно подать на  ножку XTAL1 , а ножку XTAL2 оставить свободной.  Параметры такого сигнала см. в ДШ.

 Есть еще выводы и для подключения очень точного но медленного часового кварца - обычно это маленький цилиндрик с двумя гибкими ножками, конденсаторы ему обычно не нужны, да и сам этот кварц нужен если вы хотите сделать например часы реального времени - т.е. он совсем не обязателен. 

Порт в МК

  С учетом занятости некоторых ножек МК под конструктивно заданные функции, количество выводов МК доступных вам для использования меньше чем имеет МК ! МК ATmega16 позволяет использовать 32 ножки из 40 в корпусе DIP.  Эти 32 ножки составляют 4 порта МК

Порт в МК - это 8 ножек или линий ввода-вывода (выводов МК или IO или I-O или I/O) имеющие индивидуальные номера от 0 до 7 и общую букву A, B, C, D, ... отличающую этот порт от других. 

Пример для  PORTB Порт_B имеет (как и другие порты МК) минимум 3 сопоставленных ему регистра :

DDRB - значение битов в этом регистре определяет чем будет ножка этого порта с номером этого бита  - начальное (при включении МК или после сброса) значение "0" - ножка вход  если сделать бит = "1" (говорят: установить бит  англ. set bit ) эта ножка станет выходом. если сделать бит = "0" - говорят: сбросить или очистить бит  англ. clear bit 

PINB  - биты этого регистра показывают чем ("1" или "0") считает МК напряжение на ножке порта с номером этого бита. (этот регистр в ATmega16 нужно только читать, записывать в него что либо бесполезно).

     
 

ВНИМАНИЕ ! В микроконтроллерах AVR старой серии AT90s и в ATmega8, -16, -32, -48, -64, -88, -128, -168 имеет смысл только читать из регистров PINx.
 
В микроконтроллерах ATtiny2313, ATtiny13, ATtiny25, ATtiny45 в других ATtiny в AT90PWM2, AT90PWM3, в AT90USB, в ATmega640, 1280, 1281, 2560, 2561   Запись "1" в бит регистров PINx вызывает изменение соответствующего бита в PORTx

 Вывод этих контроллеров можно переключать очень быстро - с частотой тактового сигнала !

 
     

PORTB - бит этого регистра нужно сделать "1" или "0" что бы на ножке порта с номером этого бита появился  "1" или "0". При этом такой же бит регистра DDRB  должен быть "1" - т.е. ножка должна быть выходом.  Если она сконфигурирована как вход (т.е. её бит в регистре DDRB  очищен или равен нулю)  - то если очищен и соответствующий бит в регистре PORTB ножка будет высокоимпедансным входом (Z-состояние, вход с очень высоким входным сопротивлением более 10 МОм), а если бит в регистре PORTB установлен, т.е. равен "1" то включается "подтяжка" (pull-up) высокоимпедансного входа к  плюсу питания МК через встроенный резистор примерно 40 КОм - ножку как бы соединяют таким резистором с питанием МК.

"Подтяжку" можно использовать для создания четкой лог. "1" на ножке-входе МК без внешних компонентов. К такому входу вы можете подключить кнопку замыкающую его на  "общий" провод устройства - GND - при нажатии. При отпущенной кнопке на входе будет "1" и соответствующий бит в регистре PINx тоже будет "1".  При нажатии кнопки ее контакты замкнут вход на GND и на нем станет "0" - соответственно и в PINx  появится "0" и ваша программа сможет прочитав PINx определить что кнопка нажата.

Подтяжку на всех портах одновременно можно отключить! Для этого нужно установить бит PUD в регистре SFIOR

Вот Таблица состояния ножки МК при условии подключения допустимой нагрузки - т.е. ток через ножку не превышает 20 мА и при не активности аппаратуры МК использующей данные ножки для своей работы. 

Значение бита_х

Состояние 
вывода МК

Программа может только читать этот бит ! (Отличия для некоторых МК описаны выше)

Программа управляет 
этими битами

PBx

PINB.x

DDRB.x

PORTB.x

1

1

1

Высокий лог. уровень (вывод как бы подсоединен к питанию МК резистором 
около 20 Ом)

0

0

Низкий лог. уровень (вывод как бы заземлен 
резистором 
около 20 Ом)

определяется 
только реальным напряжением 
на ножке МК !


Напряжение 
преобразуется в "1" 
или "0" по  приведенным 
выше правилам.

0

1

Подтяжка - pull-up.
Вывод как бы подсоединен к питанию МК 
через 
резистор 40 КОм

0


Z-состояние.

ВысокоОмный вход

Аналогично для порта_C будут регистры: PORTC  PINC  DDRC  

Ножки портов обозначаются в ДШ так: 

Итак ... 

32 ножки IO микроконтроллера ATmega16 могут быть программно и индивидуально сконфигурированы (и переконфигурированы по мере необходимости) как : 

Важно: эти 32 ножки МК имеют и дополнительное функциональное назначение описанное в ДШ и книгах  - они являются входами-выходами (пишут: IO или I/O ) и для устройств периферии МК. И при активации какого либо периферийного устройства МК программой, соответствующие ножки МК автоматически конфигурируются ( для PWM не автоматически. Подробней в ДШ) так как требуется для правильной работы этого устройства не зависимо от того как они были сконфигурированы ранее. А после отключения устройства их конфигурация станет такой что была задана последней по тексту программы. (Подробнее в разделе "Alternate Port Functions" ДШ.)


Пример: 

Предположим, что ножки RXD и TXD вы сконфигурировали как входы с подтяжкой (Inputs with pull-up) затем, по ходу работы, программа включила USART на прием (например данных с COM-порта ПК через преобразователь уровней интерфейса rs-232 MAX232) и сразу же ножка RXD станет просто входом (подтяжка уберется) и по ней будут приниматься данные в МК, а вот состояние TXD  не изменится и будет доступно программе для изменения как любой другой из 32 линий IO.  

А вот если включить USART сразу и на прием и на передачу то ножка TXD   станет выходом и  не будет доступна изменению программой до выключения передатчика USART.  

После выключения USART ножки RXD и TXD снова станут входами с подтяжкой, если конечно в программе не было команд меняющих эту конфигурацию.

Назначение ножек можно изменять по ходу программы в соответствии с реализуемым алгоритмом - т.е. по вашему усмотрению.

Советую:  

Я обычно стараюсь развести неиспользуемые "подтянутые" ножки на отдельный разъем на плате - сам разъем можно не паять - но в случае необходимости вы сможете легко впаять его и так задействовать эти выводы МК.

   Что делать если внешний сигнал превышает диапазон напряжений допустимый для ножки МК ? Ответ прост : 
   Напряжение сигнала на который должен отреагировать МК может быть каким угодно большим.
Нам важно чтоб на самой ножке МК он не выходил за допустимый диапазон . Этот диапазон я указал выше.

   Чтобы выполнить это условие очевидно нужно между большим внешним сигналом и ножкой МК поставить какой то элемент на котором будет падать (поглощаться, гаситься) напряжение на которое входной сигнал выходит за диапазон допустимых напряжений для ножки МК.  Простейший, обычный вариант - гасящий резистор. Например для определения перехода напряжения сети 220 вольт через ноль (точнее близко к нулю) в системах тиристорного регулирования мощности на ножку МК подают напряжение фазы через два резистора (не чипы) включенных последовательно и имеющих общее сопротивление от 1 до 10 МОм. 

пример AppNote AVR182 

Если при этом посмотреть осциллографом напряжение на ножке МК настроенной как Z-вход - мы увидим почти меандр (прямоугольный сигнал с равными длительностями "0" и "1" ) с размахом примерно на 0.7-0.9 вольт больше напряжения питания МК.

Важно! Номинал гасящего (или токоограничивающего) резистора выбирается таким чтобы ток втекающий через него в МК не превышал тока потребляющего работающим МК, иначе возникнет "паразитное питание" МК - этот ток будет повышать напряжение питания МК проходя на вывод VCC МК через встроенные в МК защитные диоды линий (ножек I-O) ввода-вывода.

У каждой ножки I/O (у других ножек не у всех) МК есть два защитных диода - один катодом на VCC а второй анодом на GND. Не надейтесь на серьезную защиту МК этими диодами !  Ток через них не должен превышать 1 мА !

   "паразитное питание"  - возможно при питании МК стандартными стабилизаторами напряжения типа 7805  78L05 и т.п. так как они не "сопротивляются" повышению напряжения на их выходе внешним током! А вот при питании параметрическими стабилизаторами - например шунтирующий стабилизатор типа TL431 или резистор со стабилитроном - паразитное питание не возникнет,  но можно пожечь защитные диоды ...
  Если вы не можете поставить большое гасящее сопротивление,  то поставьте максимально допустимое, затем стабилитрон на напряжение чуть ниже напряжения питания МК - при питании 5 вольт подойдут стабилитроны типа  - 1N4730  1N4731  1N4732.  От стабилитрона на ножку МК поставьте резистор 1 КОм.  

Подробнее про правильное питание ( это очень важно ! ) устройства в целом и МК смотрите в АпНоутах в Книгах и проектах. Про электротехнические расчеты, о схемах деления напряжения, усиления сигнала и его ограничения - читайте в книге оглавление которой на заглавной странице курса.

Другой вариант приведения входного сигнала к диапазону напряжений допустимых для МК (это называется нормирование) - применить усилитель с нужными параметрами. Пример там.

Микроконтроллер AVR  ATmega 
ключевые моменты.

(Прерывания в AVR  -  подробно описаны
на этой странице  но НИЖЕ.)

Возможности заложенные в МК производителем 

Они определяются конструкцией МК - и дают вам шанс реализовать на нем то или иное устройство и в тоже время ограничивают вас. Обычно ключевые моменты устройства МК и его параметры указаны на первой странице ДатаШита а полному раскрытию их посвящен весь ДШ, в частности на второй странице ДШ показано расположение ножек МК в различных корпусах и их обозначения связанные с их дополнительными функциями. 
  Я ранее уже перечислял основные устройства содержащиеся в МК  AVR ATmega и называемые периферией МК. Далее в ДШ идет подробное описание каждой ножки МК и затем структурно-логическая схема МК - то как связаны его модули воедино. 
  Ограничения заключаются в том
что все устройства имеют определенные параметры и лучше, быстрее работать не могут. Вы должны это знать и  правильно подбирать МК соответствующей вашей задаче. Если производитель подключил входы АЦП к конкретным ножкам МК то вы не можете это изменить - это данность. Тоже относится и к другим периферийным устройствам - всем им сопоставлены определенные ножки МК. 
Однако  некоторые из этих устройств (например USART, SPI,  TWI он же i2c) можно реализовать программно (старайтесь избегать этого!) и тогда им можно сопоставить любые не занятые ножки IO. 
 
А что делать если вам нужно, например 4 интерфейса TWI (боле известен как i2c от philips) а в МК AVR он только один ?  Выход прост - можно применить аналоговые ключи - мультиплексоры, например компании Analog.com серии ADGxxx и программно коммутировать (переключать) ими линию SCL МК на линию SCL одного из 4 интерфейсов TWI используемого в данный момент.  Напомню что на одну линию TWI ( i2c ) можно поставить несколько устройств с разными адресами! Аналогично можно поступить и в других случаях, либо реализовать дополнительные интерфейсы программно.

  Работа МК - шевелить, дергать ножками. Это очень метко сказано. Нам нужно получить практический результат работы МК - обычно это информационные сигналы поступающие от него в виде определенных напряжений на ножках МК создаваемых в соответствии с программой. т.е. программа работающая в МК буквально "дергает" его ногами в нужные моменты времени.  Для того чтобы правильно подключить внешние электронные компоненты принимающие эти электрические сигналы от МК, важно знать как напряжения на ножках МК зависят от подключенной к ним нагрузки.
 
Программа может "приказывать" МК AVR выводить либо "1" либо "0" на ножки I/O назначенные выходами. МК преобразует эти логические уровни в напряжения на ножках открывая соответствующий полевой транзистор - ключ. 

Однако:  Если к ножке МК подключить что либо проводящее ток и так "сопротивляющееся" созданию нужных программе выходных сигналов - напряжения на ножках могут уже не достигать потенциалов VCC и GND и значительно! Это связано с тем что открытый полевой транзистор имеет некоторое не нулевое сопротивление и соответственно протекание тока через него вызывает падение напряжения. Значения этого отклонения показывают графики в конце ДШ. (Там есть и другие графики поясняющие работу МК - найдите время разобраться в них!  Наверно теперь вы понимаете почему я советую вам использовать один универсальный МК ... )

Вот, к примеру, для ATmega16

График 179 показывает каким будет напряжение на ножке МК при выводе на нее "0" при подключенной нагрузке "тянущей" эту ножку током (в мА на левой вертикальной оси графика) к источнику положительного напряжения :   

примечание: бит в регистре PORTx равен "0" а бит в регистре DDRx установлен т.е. равен "1" - значит ножка сконфигурирована как выход. Из графика видно, что при втекающем в ножку токе равном 10 мА напряжение на ножке МК будет 0.25 вольт, а при токе 20 мА уже 0.45 вольт 

 

     
 

пример:  

Вы подключили к ножке МК анодом (где у диода черточка на схеме) светодиод и хотите чтоб через него протекал ток 15 мА.  Как рассчитать токоограничительный резистор включаемый последовательно со светодиодом - от его катода к +5 вольт питания МК?  Вот так:  

  • 1) в ДШ на светодиод вы находите (или измеряете на "живом" светодиоде) падение напряжения на нем при токе через него 15 мА  - пусть это будет 2 вольта. 

  • 2) По графику выше находите что при токе 15 мА на ножке будет примерно 0.35 вольт. 

  • 3) Суммируете эти напряжения и вычитаете из напряжения питания МК:
    5 - (2 + 0.35) = 2.65 вольт - это напряжение которое должно падать  на искомом резисторе при токе 15 мА 

  • 4) Чтоб найти номинал этого резистора - по закону Ома нужно разделить падение напряжения на ток его вызывающий:
    2.65 / 0.015 = 177   Ом  

  • Выбираем ближайший стандартный номинал резистора  - 180 Ом.

 
     


Так как линия графика почти прямая до 20 мА - можно вычислить внутреннее сопротивление ключа обеспечивающего вывод низкого напряжения на ножку МК - это примерно 24 Ома. (нужно напряжение разделить на ток). 

График 177 показывает каким будет напряжение на ножке МК при выводе на нее "1" при подключенной нагрузке "прижимающей" эту ножку током (в мА на левой вертикальной оси графика) к "земле" т.е. к нулю вольт :

примечание: бит в регистре PORTx равен "1" а бит в регистре DDRx установлен т.е. равен "1" - значит ножка сконфигурирована как выход. По этому графику можно определить что при токе "на землю" в 10 мА на ножке МК будет не 5 вольт а примерно 4.75 вольт - это соответствует подключению резистора 475 Ом от ножки МК на GND.При токе 20 мА напряжение на ножке будет 4.5 вольт примерно - это соответствует подключению к ножке МК резистора 225 Ом.   

     
 

Значит резистор 240 Ом гарантирует не превышение тока через ножку МК более 20мА при замыкании его на VCC или GND.

 

     

  Пожалуйста хорошо усвойте что означают эти графики - вы будете знать что реально будет на ножках МК когда вы ими "шевелите" - т.е. выводите на них нужные вам сигналы.  Я уже говорил ранее что все сигналы аналоговые и поэтому  изменение напряжения на ножках МК не происходит мгновенно. Фронт сигнала (переход из "0" в "1") и спад сигнала (переход из "1" в "0") не вертикальные линии, а наклонные ! Наклон этот тем больше чем выше емкость нагрузки подключенной к ножке. Это связано с тем что для изменения напряжения на конденсаторе (на емкости) требуется изменение его заряда  - а изменение заряда равно произведению протекающего тока на время протекания (точнее интеграл тока по времени), так как все эти величины имеют конкретные конечные значения то и время переключения не равно нулю.

вывод:  Стремитесь к разумному уменьшению емкостей того что подключено к выходам МК

Если же емкость уменьшить не возможно - например ножка МК управляет затвором мощного полевого транзистора (затвор это по сути конденсатор) то поставьте между ними резистор хотя бы на 100 Ом. 

 

     
 

Если вам нужно получить ток превышающий 20 мА

Вы можете объединить несколько ножек МК вместе - лучше через токо-уравнивающие резисторы 20-33 Ом 

А можно применить какие либо внешние буферные микросхемы с более высоким выходным током, например счетверенный Операционный Усилитель (ОУ) AD8534 обеспечивает выходной ток до 250 мА

 
     

  МК это микроКомпьютер и он тоже может зависнуть ...

В результате не совершенства созданной вами программы или под влиянием внешних "злых сил" а может и по вашему умыслу МК может зависнуть.  Для воскрешения зависшего МК в нем предусмотрено специальное устройство - Сторожевой таймерWatchdog Timer (сокращенно WDT) - это таймер который тактируется (т.е. ведет отсчет) своим собственным встроенным в МК RC-генератором с частотой примерно 1 МГц.  WDT - активируется специальным фьюзом при программировании МК и затем программа может выключать и включать его (фьюз конечно не меняется при этом) через регистр управления сторожевым таймером - Watchdog Timer Control Register WDTCR  В этом же регистре делают установку времени через которое WDT  перезагрузит МК путем установки коэффициента деления частоты задающего  генератора .  Если WDT активирован то вы должны в своей программе расставить команды обнуления его счетчика 
    #asm
("wdr")  //
так в компиляторе CodeVisionAVR
так часто чтобы обнуление WDT  происходило через промежутки времени ГАРАНТИРОВАНО меньшие чем время переполнения таймера WDT  - я советую расставлять такие команды так часто насколько возможно.

В соответствии с ДШ Table 17. Watchdog Timer Prescale Select время от обнуления до переполнения WDT  и вызванного этим сброса МК (т.е. рестарта его программы с начала) может быть установлено вами программно от 16 мСек до 2 Сек. 

Предположим вы установили это время 16 мСек и пока программа в МК не зависла, она исправно обнуляет за счет предусмотренных вами команд. 

#asm("wdr") 


Но вот МК завис     - теперь как только WDT переполнится (не позднее чем через 16 мСек с последнего обнуления) произойдет перезагрузка МК и программа начнет свою работу снова. При этом будет установлен специально обученный бит прочитав который программа сможет при необходимости определить причину сброса, перезагрузки МК - в данном случае сброс по переполнению WDT.

     
 

Хорошая новость:
WDT
- удобно использовать в энергосберегающем режиме работы - подробнее в ДШ раздел - Power Management and Sleep Modes в таком режиме МК большую часть времени "спит" и пробуждается лишь по переполнению сторожевого таймера - выполняет что  нужно, например опрашивает ножки МК, реагирует на их изменения и опять засыпает. Соответственно МК потребляет очень мало энергии. Существуют и другие источники пробуждения МК - например изменение напряжения на его ножке.
AVR   ATtiny24 Attiny44 ATtiny84  - потребляют во сне всего 100 НАНО-Ампер ! 

 
     

Далее ... Электроника подключенная к МК


МК обычно располагается на плате, среди других электронных компонентов, для удобства рассмотрения я условно делю их на группы: 

1) задача первой группы отсечь опасные токи и напряжения для защиты схемы и нормировать сигналы подлежащие обработке в МК к виду допустимому и понятному для МК  и ещё наиболее удобному для обработки средствами содержащимися в МК. Например: вам нужно обработать сигнал датчика тока - с максимальным током в 2А. 

 

При токе 2 А падение напряжения на резисторе в 0.1 Ом будет всего 2 * 0.1 = 0.2 вольта - если подать такой сигнал на АЦП МК ATmega  (а рекомендованное минимальное опорное напряжение для него - 2 вольта и тогда 2 вольта это код АЦП 1023) то  оно будет преобразовано в код 102 а меньший ток в еще меньший код. Значит несмотря на то что АЦП имеет разрядность в 10 бит вы получите результат лишь в 7 бит примерно - грубовато...  

Очевидно нужно усилить сигнал с датчика тока в 10 раз - до 2-х вольт и мы получим оцифровку тока с разрешением 10 бит - это и называется нормирование сигналов - предварительная их подготовка.  К понятию нормирования сигналов - относится и различная фильтрация сигналов для выделения интересующего участка спектра сигналов подлежащих обработке.

Пример:
задача 9_b "Фильтрация и нормирование измеряемого сигнала перед подачей на АЦП". 

     
 

Хорошая новость: МК ATmega16 -32 -64 -128 и некоторые другие  имеют встроенный усилитель входного сигнала в 10 и в 200 раз. Этот усилитель симулирует PROTEUS но не симулирует VMLAB

 
     

Например еще раз: вам нужно передавать в МК информацию от COM-пота ПК - но сигналы USART MK  "перевернуты" относительно COM-овских и напрямую связать их неправильно!  Оптимальное решение поставить специальную микросхему MAX232 или ее дешевый и доступный аналог - который можно найти  на rel.ru  по запросу:  *232* 

С помощью этой микросхемы вы согласуете физические уровни (проще - напряжения) сигналов ПК к уровням требуемым USART МК (ножка RxD)  - можно сказать нормируете их. Тоже делает и "шнурок" для сотового телефона  

2) другая часть электроники подключенной к МК предназначена для обеспечения стабильного и достаточно "чистого" питания МК


3) группа электронных компонентов подключенных к МК и обеспечивающие вывод в том или ином виде результата его работы. 

Примером может быть также микросхема MAX232 но теперь нормирующая сигнал от USART МК (ножка TxD) для того чтобы его принял и понял COM-порт ПК

Конечно существует большое количество других устройств которыми может управлять МК непосредственно или через специальные микросхемы интерфейсы или драйверы - Тиристоры, Симисторы, Транзисторы, элементы индикации, радио модули и так далее.

Важно!  Все перечисленные группы внешних компонентов общаются с внешним миром. А в мирУ бушуют страсти, трещат статические разряды !!!  т.е. нужно предусматривать элементы защищающие от вредного воздействия окружающей среды. И сами силовые элементы управляемые МК и коммутирующие большие токи так же могут являться источником помех.

Это деление "обвязки" МК на группы чисто условное, и конечно элементы любой группы могут не только передавать или принимать информацию (сигналы) на МК но и обмениваться с ним - это микросхемы памяти, LCD дисплеи, другие микросхемы сообщающие МК тем или иным способом о том что в них происходит. 

     
 

О защите входов и выходов МК и устройства в целом я рассказываю в задаче-упражнении 9. Там же пример нормирования входного сигнала с датчика. Подробней о защите читайте на сайте очень полезном для начинающих электронщиков микроконтроллерщиков эмбедеров  caxapa раздел: схемы - защита.

 
     

 

Прерывания в AVR.

Interrupts - прерывания, очень важная и мощная функция МК  AVR  ATmega  ATtiny. 

Иногда требуется максимально быстрая реакция программы на какие-то события. Например приход данных на USART или завершение АЦП или изменение уровня на ножке МК подключенной к контактному датчику или переполнение таймера ...  Быструю реакцию обеспечивает механизм прерываний.  При возникновении события которое может вызвать разрешенное в данный момент времени прерывание и при ГЛОБАЛЬНОМ разрешении прерываний (бит7 в регистре SREG "установлен"), выполнение программы МК останавливается, сохраняются (запоминаются) место остановки и некоторые нужные данные, бит7 в регистре SREG обнуляется, очищается флаг сработавшего прерывания и затем происходит вызов и выполнение функции обработчика данного прерывания. 
  От момента наступления события до начала выполнения функции обработчика прерывания проходит не менее 4 тактов процессора.    Т.е. 
Скорость реакции на прерывание напрямую зависит от частоты на которой работает МК !

     
 

В регистре SREG есть бит7 называется он " I "

  • Если этот бит равен "1" (установлен) то ГЛОБАЛЬНО разрешены прерывания - значит могут возникать разрешенные индивидуально прерывания. 

  • Если этот бит равен "0" (бит сброшен, очищен) то ГЛОБАЛЬНО запрещены прерывания  - значит любые события не вызывают прерывания программы. 

Флаг прерывания  - это просто бит который становится "1" (устанавливается) при возникновении события которое может вызвать прерывание не зависимо от того разрешены ли прерывания ГЛОБАЛЬНО (установленным битом 7 в SREG) или индивидуально - т.е. флаг устанавливается даже если прерывание не обрабатывалось программой и не было разрешено. Что бы сбросить флаг прерывания нужно записать в него "1"

Программно установить бит-флаг НЕВОЗМОЖНО !

 
 

 

 

Если программа находится в функции обработчике прерывания и в этой функции не был установлен бит SREG.7 то другие события вызывающие прерывания не могут уже вызвать прерывание программы и их обработку. 

Делайте функции обработчики прерывания как можно короче !  Не засиживайтесь в них ...

Если сейчас произойдут события которые могут вызвать прерывания то установятся их флаги, но даже разрешенные прерывания не произойдут ! Нужно тщательно продумывать алгоритм программы  чтоб успевать обрабатывать все прерывания - т.е. не пропускать нужные события.
В конце функции обработчика прерывания компилятор ставит инструкцию RETI после выполнения которой  бит7 в регистре SREG становится "1" - т.е. прерывания опять ГЛОБАЛЬНО разрешаются и программа продолжает выполняться с того места где она была в момент возникновения прерывания.
НО ! Если при глобальном разрешении прерываний обнаружится установленный флаг разрешенного прерывания, то будет вызвана функция обработчик этого прерывания. Такая ситуация может возникнуть если во время выполнения обработчика прерывания возникло другое прерывание - т.е. установился его флаг. Если возникнет несколько разрешенных прерываний одновременно то первым будет выполняться то которое выше в списке векторов прерываний МК в ДШ. Соответственно  по мере отработки накопившихся и разрешенных прерываний их флаги будут очищаться. А вот флаги неразрешенных прерываний не очистятся пока программа этого не сделает записью в них числа 1. Вы можете запрещать и разрешать как все прерывания сразу, так и каждое по отдельности!

Все сразу - изменяя бит7 в регистре SREG вот такими строчками в компиляторе CodeVisionAVR:

#asm("sei") /* бит_I сделать "1" теперь разрешенные прерывания будут обрабатываться, если есть установленный флаг прерывания то произойдет вызов его функции обработчика */

#asm("cli")  /* бит_I сделать "0" запретить все прерывания ГЛОБАЛЬНО. */ 

По отдельности рулить прерываниями сложней  это ДШ надо читать ...  или хотя бы русское описание AVR 

Прерывания легко настроить интерактивно и главное ПРАВИЛЬНО с помощью мастеров начального кода компиляторов CVAVR   и  ICC.  Как использовать мастер начального кода показано в упражнениях курса

В МК AVR и других, прерывания могут возникать по многим событиям:

В общем снова - читайте ДатаШит .. Для ATmega16 прерывания перечислены в таблице 18 "Reset ana Interrupt Vectors"

     
 

Примеры объявления функций обработки прерываний в популярных компиляторах:

в CodeVision:

interrupt [прерывание] void adc_isr(void) 
{
 код выполняемый при возникновении  разрешенного локально и глобально прерывания
}

в ICC :

#pragma interrupt_handler timer0_ovf_isr:7
{
 код выполняемый при возникновении разрешенного локально и глобально прерывания
}

просто указываем компилятору название функции timer0_ovf_isr которая будет вызываться при возникновении прерывания № 7. 


в IAR:

#pragma vector=прерывание
__interrupt void irqHandler(void)
{
 код выполняемый при возникновении  разрешенного локально и глобально прерывания
}

в WinAVR:

#include <avr/interrupt.h>

ISR(прерывание_vect)
{
 код выполняемый при возникновении  разрешенного локально и глобально прерывания
}

В примерах слово "прерывание" нужно заменить на название прерывания из ДатаШита либо из заголовочного файла   *.h  для используемого МК.

 
 

 

 

Скачайте и запустите проект: Демонстрация механизма прерываний в AVR 

Программировал в CVAVR и симулировал в VMLAB

К ножкам-входам внешних прерываний  INT0  INT1  INT2  ATmega16 я подключил резисторы по 10 КОм к + питания МК для создания внешней подтяжки и еще подключил три кнопки   0,  1  и  2 в "Control Panel" симулятора. Нажимая кнопку мышкой можно замыкать соответствующую ножку на "землю" создавая на ней "0" на время пока кнопка нажата. Когда кнопки не нажаты на ножках "1".

Конфигурировал прерывания и USART с помощью мастера генератора начального кода CVAVR.

Посмотрите в панели "регистры и флаги" в регистре флагов GIFR (обязательно почитайте об этом регистре в ДатаШите) установился бит_5,  если навести на него мышку то появится его название - INTF2 - это флаг прерывания INT2. Вы видите что хотя мы не включали это прерывание его флаг установился при событии соответствующем ему. Как я вам и обещал выше !

Теперь (симуляция продолжается, время с начала программы МК в правом нижнем углу бежит...) нажмите K0 в панели "Control Panel" сразу же произойдет разрешенное прерывание, и программа перейдет в функцию обработчик прерывания INT0  и  в виртуальном терминале TTY появится сообщение:

int0

Отпустите K0 и нажмите K1 отпустите K1 

Смотрите: так как мы находимся в отработке паузы 100 мС в обработчике прерывания от INT0.   Бит_7 в SREG остается "0" и значит прерывания не исполняются. Все правильно - но отпускание кнопки K0 вызвало установку флага INTF0 а нажатие и отпускание K1 установило флаг  INTF1.  

Если теория прерываний изложенная мной выше верна то по завершении текущей обработки прерывания  INT0  должны произойти еще по 1 вызову обработчиков прерываний INT0 и  INT1 - причем сейчас МК не "знает" какое из них случилось первым и значит будет обрабатывать их по порядку перечисления в таблице 18 ДШ. 

Ждем не долго ...  появляются с некоторой паузой одно сообщение и затем другое свидетельствующие о вызове соответствующих обработчиков прерываний:

int0
int1

При этом вначале очистится бит INTF0, а затем INTF1.


Вопрос для самоконтроля:
Почему нажатие и отпускание кнопки K0 вызвало две обработки прерывания INT0, а от кнопки K1 только одно ?
Попробуете симуляцию снова и измените порядок нажатия кнопок:
вначале K1 а затем K0  - и вы увидите что последние два прерывания все равно будут выполнены в том же порядке:  int0  и затем   int1

Важно ! Из примера выше следует что  Накопление не обработанных прерываний крайне не желательно так как МК "не помнит" последовательность возникновения соответствующих событий !   Практическое применение  прерываний будет рассмотрено  в задачах - упражнениях курса.

... и теперь самый пожалуй интересный пунктик - ПРОГРАММА "зашитая" в МК

Я постулировал ранее что - Возможность МК действовать по вашей программе - вот суть-соль МК. Это главное отличие МК от "обычных" непрограммируемых микросхем.
Я уже рассказал выше

AVR ATmega содержит многократно программируемую FLASH память программ - в нее загружается (есть различные варианты прошивки, загрузки программы - достаточно пяти проводков от LPT-порта к МК) программа которую будет исполнять МК при наличии следующих условий: 

1) есть питание МК 
2) есть уровень "1" на выводе Reset 
3) есть источник тактового сигнала 
4) нет сброса от иного источника сброса (== перезагрузки МК)

При наличии этих условий МК начинает шагать по программе которая представляет из себя последовательность инструкций которые может выполнять МК иногда прерываясь так как было описано выше.  

Даю определение - запомните : Программа взаимодействует с МК записывая, изменяя в нужное время числа в регистрах МК и читая в нужное время числа из определенных регистров. Важно понимать -  Именно взаимодействует с МК, а не просто управляет! То что содержится в регистрах МК влияет на ход выполнения программы если она это предусматривает.

О как !   ... да что ж это за регистры такие, будь они не ладны!

Регистры  МК 

Регистр (Register) MK AVR - это набор из 8 бит т.е. 1 байт. Как бы ящичек с 8-ю ячейками с номерами от 7 до 0. В этих ячейках находятся 8 бит этого регистра.

bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

бит7 самый левый - MSB - наиболее значимый бит, старший бит.

бит0 самый правый - LSB - наименее значимый бит, младший бит.

Бит может иметь значение "1" или "0". 

8 бит составляют байт и могут хранить десятичное 
число от 0 до 255  

другие формы записи этого диапазона чисел таковы: 
в 16-тиричном виде: от 0 до 0xFF  или от $0 до $FF  или от 0h до FFh
в двоичном виде от 0b00000000 до 0b11111111  

Число которое находится в регистре - есть значение регистра.

Значение в регистре вычисляется как сумма составленная из восьми 
таких слагаемых : 

(значение бита) умножить на (2 в степени равной номеру бита)

Пример: 
- если бит 7 равен "1" то он добавляет в сумму число 128 (это 2 в 7-й степ.)
- если бит 4 равен "1" то он добавляет в сумму число 16 (это 2 в 4-й)

Теперь вы видите почему бит 7 называется "мост сигнификант бит"  - MSB - наиболее значимый бит, старший бит.

Если некоторый бит равен "0" он конечно ни чего не добавляет в сумму.

     
 

Запись бит_Х означает что речь идет о бите с номером Х

Запись бит_5_2 или бит 5..2 и подобные означают что речь идет о нескольких битах, тут:  5  4  3  и  2

 
     

Регистры в других МК бывают и 16 битными и больше! но лучше говорить: шире.

в МК AVR есть 32 регистра общего назначения из которых 6 регистров R26 - R31 (или R26_31) могут быть виртуально объединены в пары и таким образом получается три 16-битных регистра.

Регистры МК имеют индивидуальные, уникальные адреса и наименования которые обычно образуются из их полного названия в ДШ (DS, DataSheet). Полное название регистра соответствует назначению регистра. 

Например: 
полное название регистра - Watchdog Timer Control Register 
сокращенное название – WDTCR
назначение регистра - управление сторожевым таймером  
адрес регистра WDTCR - $21 или 0x21

Такой же принцип соблюдается в именовании отдельных битов регистров.

Например: 
название бит - Bits 2..0 – Watchdog Timer Prescaler 2, 1, and 0
сокращенное название – WDP2, WDP1, WDP0
назначение регистра - биты установки коэффициента деления 
тактовой частоты сторожевого таймера  

При программировании на языке Си вы можете в программе обращаться к регистрам МК по их названию в ДШ - это удобней чем помнить абстрактные числа - адреса регистров. Например так: 

PORTB++;       // добавить 1 в значение регистра PORTB

PORTA = 135; 
// записать число 135 в регистр PORTA

PORTA ^= (1 << n); 
/* изменить 
бит_n в 
регистре PORTA 

я специально
написал этот комментарий 
в несколько 
строк для примера 
  */

Все  регистры МК  в таблице в конце ДШ ! Там же названия всех бит в регисторах, их номера и страницы ДШ на которых они описываются.
Вот пример схемы -- устройства регистра WDTCR из ДШ

Регистры целиком либо отдельные биты могут быть: 

- R/W можно читать и записывать (== изменять) 
- W   можно только записывать в него
- R    можно только читать, записать в него не получится.

Initial Value - это то что будет в регистре после включения питания или после появления перехода из "0" в "1" на ножке Reset или после прекращения сброса  МК от другого источника. После такой схемы регистра в ДШ идет подробное описание функций каждого бита !

Обязательно разберитесь с регистрами ! они являются средством общения программы с МК  т.е. РЕГИСТРЫ очень важны. 
Белых пятен быть не должно !

Программа не может измерить уровень существуют на ножке МК, но она может узнать об этом прочитав значение соответствующего бита в соответствующем регистре !  

Например так : 

if (PINB.5) { сделать что-то };   
/* если на ножке PB5 есть "1" (не "0" значит "истинно") то программа сделает что-то, а если на ней "0" (значит "ложно") то не сделает, а просто пойдет дальше, на следующую строку */

Дойдя до этой строчки программа проверит чему равен бит_5 в регистре PINB - в нем МК сохраняет результат преобразования напряжения на ножках порта_В  в логические уровни "0" или "1" по правилам о которых я рассказал уже ранее - и по результату проверки программа будет действовать далее. 

while (PINA.6) { делать что-то };   
/* пока на ножке PA6 есть "1" (не "0" значит "истинно") то программа будет  делать что-то, и опять проверять что на PA6 */

Дойдя до этой строчки программа проверит чему равен бит_6 в регистре PINA - если он "1" то выполнит то что в скобках {        } затем опять проверит этот бит. Так программа будет работать пока не будет прерывания либо пока бит_6 не станет "0". 

Если бит_6 стал "0" то программа пойдет дальше не выполняя того что в  {        } 

Значит так вы можете ввести в программу ожидание нажатия кнопки замыкающей ножку PA6 на "землю" (только обеспечив "1" на ножке при отпущенной кнопке).

while (PINA.6); 
/* пока на ножке PA6 есть "1" программа будет выполнять эту строчку. 
Когда возникнет "0" программа перейдет на следующую строку программы. */

 

Если вы уже "въехали" или "въезжаете" то надеюсь поняли 
что регистры PIN_Х должны быть ReadOnly - "только чтение" - ведь значения в них может определять только сам МК по реальным уровням напряжений на соответствующих ножках

Программа может только читать из этих регистров.

Если не понятно - перечитайте пожалуйста !  Не оставляйте на потом !

ПРОГРАММА  для  МК
ПО для микроконтроллеров

Компиляторы  и     Симуляторы 


Книги и учебники по электронике и микроконтроллерам  AVR

Это 4-я страница краткого курса.  вы уже должны представлять себе


Если вы читаете курс не первый раз и все равно не можете ответить на эти вопросы - наверно вам нужно остановится и попробовать найти ответы в прочитанной части курса либо в книгах.   

Иначе понимание дальнейшего материала курса может оказаться затруднительным. 

 

Итак ...

Пора создавать программу которая, будучи загруженной (зашитой, прожженной) в МК, будет изменять физическое состояние его внутренностей и ножек делая записи в регистры МК и узнавать о физическом состоянии содержимого МК читая его регистры с целью выполнения задуманного вами.

Регистры...  регистры...  регистры... 

Короче - хотите что-то включить, выключить, поменять в МК - найдите в ДШ те регистры и биты которые за это отвечают 
и выясните что именно нужно записать в них ! 
и у вас все получится...

Особенно просто и правильно вы этого добьетесь с помощью мастера интерактивного создания кода программы. Про мастер начальной конфигурации МК написано ниже.

Программу для МК удобно создавать в специальных программах - называются они компиляторы. Если кроме компилятора в пакете есть отладчик-симулятор и/или программатор то это уже IDE (интегрированная среда разработки). 
  Компилятор позволяет написать программу для МК на универсальном языке программирования - одинаковом и для ПК и для различных МК
(кстати для МК требуется всего 3-5% всех возможностей языка программирования). 
  Текст программы набранный вами (или другими добрыми людьми) в компиляторе называют исходным кодом (или исходником или сырцом - англ: source code
Компилятор по вашей команде проверяет отсутствие ошибок в набранном исходнике и, если ошибок нет, преобразует исходник (компилирует его) в специальный файл обычно с расширением .hex  - его называют  "прошивка". 
  Прошивку с помощью программатора  (для AVR это например 5 проводков с параллельного порта ПК) помещают во FLASH память программ МК и при необходимости частично в его EEPROM.

Очень трудно написать программу сразу правильно и без ошибок поэтому - Важнейшим этапом разработки электронного устройства является отладка программы МК  (программа МК называется - firmware). Для отладки вы : 

- включаете ваше устройство с прошитым МК (либо симулятор МК)
- находите отклонения от требуемого алгоритма вызванные ошибками проги, 
- выявляете хитрыми способами эти ошибки, 
- вносите соответствующие изменения в исходный текст программы  
- опять компилируете  
- прошиваете новый .hex в МК и опять на верхний пункт этого списка

И так до победного конца - т.е. до тех пор пока устройство заработает  так как вам нужно.

Не всегда допустимо включить устройство не зная наверняка правильно ли работает программа МК - в некоторых случаях могут произойти серьезные и дорогостоящие повреждения обвязки МК и другой аппаратуры.Иногда требуется проверить работу МК не имея его и 
вообще какой либо реально спаянной схемы и самого МК.  В этих случаях я рекомендую использовать специальные программы - Симуляторы. 
Симулятор приблизительно моделирует на ПК работу "прошитого" вашей программой МК и его обвязки - т.е. электронных компонентов окружающих МК по схеме устройства. Кроме того симуляторы позволяют вам: 

Теперь подробнее ... Компиляторы Си для AVR

Не пугайтесь! я не предлагаю вам изучить еще и язык Си - мы просто будем использовать несколько инструкций из него - как я говорил всего несколько процентов языка. Я сам начинал изучать и применять МК сразу на Си - и очень доволен результатом. Считаю, что : 

Для начинающих наиболее удобен в работе 

компилятор Си для AVR   CodeVisionAVR  ( или CVAVR) Вам нужно скачать и установить эту программу!  (демо-версия доступна с официального сайта  (< 4 Мб)) Полную версию можно найти на заглавной странице курса.  Компилятор содержит очень понятный и
очень мощный генератор начального кода программы по вашим потребностям в конфигурации периферии МК AVR - называется он :
CodeWizardAVR

 

 

Вам нужно просто выбрать МК, частоту тактирования, затем открыть ярлыки тех устройств МК которые вы будете использовать и установить нужные параметры их работы. 
Затем  мастер ("визад") создаст файл проекта .prj и файл  исходного текста программы на языке Си с расширением .c - в нем уже будет содержаться код на Си конфигурирующий МК по сделанному вами "заказу". Вам нужно будет добавить лишь код реализующий нужный вам алгоритм работы устройства. Используйте этот мастер и далее по ходу работы программы - точно так же как и в начале, но не генерируйте новые файлы а просто откройте меню "файлы - просмотр" и посмотрите нужный кусок программы на Си, возьмите что вам нужно и вставьте в вашу программу.

     
 

Подробно и с картинками работу с КодВизадом - мастером начального кода CodeVisionAVR я описал в задаче 1

 
     

Обязательно читайте Help  к компилятору - по сути это одновременно и учебник  по Си для AVR и именно в нужном вам объеме ! Это относится и к другим используемым вами программам.  Читайте инструкцию и помощь ! Смотрите пробуйте изучайте ПРИМЕРЫ к программе ! 

Компилятор CodeVisionAVR  имеет и встроенный программный модуль  для прошивки МК  и конфигурирования фьюзов прямо в схеме Компания Atmel подсказывает как начать работать с этим компилятором Си для AVR:  AN AVR033  "Getting Started with the CodeVisionAVR C Compiler"

Это  АпНоуто Atmel - надеюсь вы уже скачали хотя бы их список ! Если нет то скачайте обязательно их перечень.Они ВСЕ нужны ВАМ !!! как справочник конкретно по AVR.

Для  полного цикла разработки устройства достаточно только одного компилятора CodeVisionAVR.  Однако, я рекомендую вам, скачать 
еще один компилятор: 
ICC AVR  от компании  Imagecraft 
Я использую и его генератор начального кода на Си - конфигуратор периферии AVR - в паре с CodeWizardAVR. Работая в паре, два мастера конфигурирования МК - идеально дополняют друг друга!  Например конфигурация Таймеров МК по моему лучше, понятней и наглядней сделана в мастере ICC.  Atmel - подсказывает как начать работать и с этим компилятором Си для AVR в Апликейшн Ноуте: AN AVR031 "Getting Started with ImageCraft C for AVR" 

     
 

В компиляторах есть отличные примеры программ на Си для наиболее часто встречающихся задач на МК 

в CodeVisionAVR примеры в папке - CVAVR\Examples 
в ICC примеры находятся в папке - ICC\examples.avr
Примеры - это исходные тексты программ на Си для управления периферией МК и интерфейса (общения) с популярными внешними устройствами. Исходники снабжены подробными комментариями! 

Комментарии это то что написано :
- после двух косых черточек
// - в одну строку !
- либо между 
/*  и  */ 
-  в одну или несколько строк 

Не забывайте и вы комментировать тексты ваших программ. Иначе, буквально через пару месяцев, вам будет очень затруднительно понять, что делает тот или иной кусок даже ВАШЕЙ программы!

 
     

Существуют и другие компиляторы. БЕСПЛАТНЫЙ   и  великолепный  WinAVR (размер 25 Mb) - по честному бесплатный пакет на основе
компилятора GCC - о нем очень хорошие отзывы.
Создает очень правильный и компактный код! Есть версия и под Linux. Есть вариант WinAVR в USB-флэшке. Этот компилятор хорошо интегрируется с симулятором VMLAB и фирменным симулятором Atmel - AVRstudio   (о симуляторах ниже и в самом низу страницы)  Вы ставите на ПК WinAVR  и забываете о нем!  Вся работа идет из симулятора VMLAB  - в нем есть пример такой интеграции, находится в папке: C:\VMLAB\WinAVRdemo 

Работать с самим WinAVR тоже очень просто.

Компиляция проекта в WinAVR

Подробней о WinAVR читайте в низу этой страницы.

 

AtmanAVR   C/C++ Compiler AVRGCC  - он как и WinAVR основан на GCC но имеет отладчик и ГЛАВНОЕ для начинающего: прекрасный генератор начального кода ! 

Самый лучший и дорогой -  IAR  - требует несколько замысловатой настройки, не имеет множества примеров в инсталляции и не имеет генератора начального кода. Хотя компания IAR явно считает генератор полезным, так как продает его в виде отдельного программного продукта. Компилятор IAR генерирует самый  быстрый и компактный код. Demo версия на 30 дней - полностью рабочая без ограничений, нет только не нужных начинающему исходников включенных в пакет библиотек.  Вы можете скачать DEMO с сайта производителя - примерно 65 Мб. 

     
 

Примеры программ на Си подходят  с незначительными изменениями для любых компиляторов и для любых МК ! Так как язык Си машино не зависимый - т.е. программы мало зависят от того для какого процессора они написаны.

Огромное количество НУЖНЫХ исходников (примеры программ) для AVR на Си здесь - AVRLib  можно скачать все одним ZIP-архивом. 

 
     

 

Средства отладки программ и устройств содержащих МК Симуляторы для AVR и электроники


Вы скачали компилятор Си для AVR CodeVisionAVR  и АпНоуты  инсталлировали его и получили  файл прошивку для МК. Естественно вы хотите узнать - будет ли прошивка, а значит ваша программа работать в МК так как вам нужно. Для этого удобно использовать специальные 
программы для ПК называемые симуляторами. 
Не имея МК, не покупая эл. компонентов и без пайки. Без риска спалить что либо Вы можете проверить работу не только программы загруженной в модель МК но и работу модели целого электронного устройства. Записать на диск результат его работы для последующего анализа, поиска недочетов.

В задачах-упражнениях курса я использую Бесплатный симулятор-эмулятор для AVR   -   VMLAB (скачайте и установите на ПК)

Несмотря на небольшой размер (около 4.2 Мб),  программа является самостоятельным средством разработки ПО на ассемблере для МК сразу двух производителей: ATMEL.com и ST.com.

Мультипроцессорность - это эмуляция двух МК в устройстве, у каждого своя прошивка и они работают не зависимо - это очень мощно если правильно этим воспользоваться! 

Юзер дефайн компонентс -
в общем если вам нужен какой либо электронный компонент отсутствующий в списке VMLAB, вы можете создать его сами! в соответствии с ДШ или по вашим потребностям - даже не существующий в природе!

 Я сделал упражнение - задачу 3 в которой очень подробно рассмотрел симуляцию программы на VMLAB с картинками. 

     
 

В поставку VMLAB включено множество примеров программ и прошивок для немедленной симуляции - эмуляции устройства с МК. Примеры находятся в папках:  Tutorial  и  AVR_demo Запустите их и освойтесь, поиграйте  с симулятором на досуге ...

 
     

Есть пример работы VMLAB с CodeVisionAVR.
откройте файл проекта 
C:\VMLAB\AVR_demo\codevisi.prj и по-симулируйте ! При симуляции вы увидите движение по исходному тексту программы на Си, и можете расставлять точки останова программы, наблюдать за изменениями значений в регистрах МК, посмотреть осциллограммы сигналов на ножках МК и многое другое ...  

Уже упоминал: пример работы VMLAB с WinAVR вы устанавливаете winavr в папку по умолчанию и больше ни когда не заглядываете в неё Вся работа от написания кода на Си до отладки выполняется из VMLAB - это очень удобно.  C:\VMLAB\WinAVRdemo\файлы.prj -захотите попробуете ... 

     
 

Совет !

Скачайте мою заготовку (Шаблон, "РЫБА" - всего 6 Кб) для быстрого старта в совместном использовании компилятора CodeVisionAVR и симулятора VMLAB с МК ATmega16

Распакуйте файлы из архива в папку: С:\VMLAB\WORK

Теперь откройте проект cv.prj в компиляторе CodeVisionAVR. Вы можете править текст программы  (исходник) и перекомпилировать его. Для эмуляции работы устройства откройте  в VMLAB проект vmlab.prj

Вы можете проверить работу программы на Си для МК ATmega16 мигающей светодиодами и посылающей сообщение через USART на монитор-терминал VMLAB.

Если добавить адаптер MK- rs232  то сообщения можно будет увидеть на экране ПК.

В общем качайте ! - это нужно ВАМ !

 
     


повторю :

На софт-эмуляторе симуляторе VMLAB мы будем проверять работу программы для разрабатываемого устройства.  

Файл-прошивку для МК (расширение  .hex) созданный в компиляторе будем прогонять в симуляторе МК с внешними компонентами и смотреть что работает, что нет, и как работает... 

При необходимости будем корректировать исходный текст программы на Си, опять компилировать, и так по кругу до достижения правильной 
работы устройства. Этот процесс называется - отладка программы или дебагинн - очистка от всякой нечисти - "тараканов" и "жучков"...
 

Скачав рекомендованные программы - установите 
их на диск С:\  в каталоги :  

CVAVR      ICCv7avr         VMLAB

тогда рабочие файлы будут находятся по тем же адресам что и в задачах-примерах.  Значит будет проще помочь, ответить на ваши вопросы.
Сделайте архивы установленных программ целиком - это поможет восстановить, случайно испорченные при опробовании программ, файлы примеров и помощи, без переИнсталляции.
  

     
 

Хелпы во всех рекомендуемых программах качественные  и подробные! НЕ забывайте их читать! 

 
     

Не обязательный для курса но   ВЕЛИКОЛЕПНЫЙ Пакет для разработки электронных устройств от схемы до печатной платы  PROTEUS Действительно супер ! 
Во первых PROTEUS может симулировать несколько МК  в одном устройстве, причем не только AVR но и PIC и Motorola и 8051 и даже ARM7 вперемешку ! 
Во вторых в поставку PROTEUS входит очень много моделей компонентов. 
В третьих
  вы можете симулировать любые электронные устройства и не содержащие МК и очень сложные и электро-механические системы - это очень полезно, 
Вам нужно проверить какую то идею или вариант реализации чего либо ? Вы можете не паять, не искать детали, запоминающий осциллограф и другие измерительные приборы, а Просто "соберите" вашу схему в PROTEUS и посмотрите как  она будет работать, каковы будут выходные параметры. PROTEUS - симулирует очень реалистично !  И главное наглядно видна работа устройства, напряжения и токи в нем.
В четвертых
  PROTEUS - по сути справочник электронных компонентов  Когда вы просматриваете библиотеки для добавления компонента на схему - вам сразу показываются его основные свойства и корпус компонента - какова его площадка на плате. Просто класс ! Для поиска компонента вам достаточно ввести в окно несколько символов из его марки или описания и затем выбрать из предложенных категорий.в пакет включены отличные примеры работы в  PROTEUS  примерно 60 устройств готовых к симуляции. Это : 

... Короче все примеры "весят" 16 Мб в распакованном виде !

Вы можете скачать DEMO версию (около 26 Мб) - она полностью рабочая !  Только одно ограничение - не позволяет вам сохранить результат вашей работы. Читайте Краткий Курс  Самоучитель    PROTEUS                     

     
 

А если нет модели нужного вам компонента ? Вот что я придумал -

Если вы не находите модели нужного вам компонента, то вы можете изобразить ее с помощью еще одного МК и возможно некоторых существующих компонентов. Дело в том что симуляторы не против не реально высокой частоты работы симулируемого МК - я пробовал 500 МГц в PROTEUS и все работает. Думаю вычислительная мощность МК в таком режиме позволит вам изобразить что угодно. Преимущество моего метода - Вам не нужно изучать методику и иметь инструментарий для создания моделей для VMLAB или PROTEUS стандартным способом. Вы лишь лишний раз поупражняетесь в программировании МК с которым работаете.  Кроме того теперь PROTEUS не работает с моделями созданными без специально полученного кода для создания модели !  А по моему  методу вы сможете делать модели и при желании продавать их не имея такой лицензии и законно!

Надеюсь вы попробуете такой финт ушами ...

 
     


Итог этой страницы курса :

Вам необходимы две программы - CVAVR  и  VMLAB для усвоения дальнейшего материала курса.
 

часть 1 

Язык Си для МК

(Чуток, но и  этого будет достаточно ...)



Я расскажу об устройстве и структуре программы на языке Си  и опишу используемые в МК  конструкции языка. 

По умолчанию компилятор CVAVR. В других компиляторах могут быть незначительные отклонения, нюансы не связанные с языком Си а обусловленные стараниями и предпочтениями разработчиков этих компиляторов.

Я покажу  вам, что Си это ДЕЙСТВИТЕЛЬНО ОЧЕНЬ  ПРОСТО, если у вас реальные для начинающего цели! 

     
 

Кстати БЭЙСИК тоже не плох ! Вот скачайте  архив (5 Кб всего) с перечнем  АпНоутов - великолепных и интересных устройств  в которых программы для МК  AVR написаны на языке Бэйсик. Скачать BASCOM-AVR-1.11.8.3 full - полная версия можно там

 
     

Минимальная программа на Си может быть такой:

     
 

main(){}

 
     

Эта программа не делает ни чего полезного - но это уже программа и она показывает что в программе на языке  Си - должна быть главная функция main - обязательно ! Реальные программы на Си конечно больше.  

Скачайте и Распечатайте  - Памятка Си для МК на ОДНОЙ странице !

Рассказывая про МК я говорил вам что, задача программы МК:  читать числа из регистров МК,  делать что-то с ними и записывать числа в регистры. Только так программа может общаться с МК. Как это делать на языке Си

Регистры МК в программе на Си имеют названия как и в ДШ и так как  числа в большинстве из них можно менять - для программы регистры 
являются по сути переменными.

1)     Чтобы поместить число в переменную (в регистр)   в  Си  есть оператор присваивания  - это знак   =    ("равно" ) .    В  Си этот знак не означает равенство , =    в Си означает  вычислить результат того что справа от оператора присваивания  и поместить этот результат в переменную находящуюся левее оператора присваивания.

     
 

PORTB = PINB + 34;/* Эта строчка на Си означает
Взять (прочитать, считать) значение переменной (регистра) PINB, затем прибавить к нему число 34 и поместить результат в переменную PORTB */

 
     

 

     
 

ПЕРЕМЕННАЯ = PINC; /* Эта строчка на Си означает
Взять (прочитать, считать) значение переменной (регистра) PINC и поместить результат в переменную с именем ПЕРЕМЕННАЯ */

 
     

Чтобы  в  Си взять (прочитать) число из регистра или значение переменной нужно написать его название НЕ непосредственно с лева от  оператора присваивания !    во загогулина понимашшшь... Ж)

примеры :

1) Строка где переменная стоит слева от =  но через знак &

PORTB & = 0x23;

на Си означает - прочитать содержимое переменной PORTB, затем выполнить "поразрядное (побитное) логическое И" между прочитанным значением и числом 0x23  и поместить (записать, присвоить) результат в переменную PORTB    

2) Строка где переменная стоит непосредственно слева от =

PORTB = 0x23;

на Си означает - не читая содержимое переменной PORTB присвоить ей значение 0x23  

     
 

Вместо & "И" (AND - только 1 и 1 дают 1) могут быть и другие побитные логические операции: 

| "ИЛИ"   (OR только 0 и 0 дают 0)    

^ "Исключающее ИЛИ" (XOR  изменить бит напротив "1")

~ "инвертирование битов" (INV изменить биты регистра)

и арифметические операции:    +  -  *  /  %

 
     

С оператором присваивания 
используются вот такие сокращения:

ДЛИННАЯ ЗАПИСЬ

 

СМЫСЛ

 

СОКРАЩАЕТСЯ ДО

x = x + 1;

 

добавить 1

 

x++; или ++x; 

x = x - 1;

 

вычесть 1

 

x--; или --x; 

x = x + y;

 

прибавить y

 

x += y;

x = x - y;

 

вычесть y

 

x -= y;

x = x * y;

 

умножить на y

 

x *= y;

x = x / y;

 

поделить на y

 

x /= y;

x = x % y;

 

 остаток от деления

 

x %= y;

x--;

 

вычесть 1

 

x -= 1;

x++;

 

добавить 1

 

x += 1;

примеры :

     
 

10010 | 1001111 // "ИЛИ" - только 0 и 0 дают 0 
                    //     англ. название  OR

   1011111  // это результат

// только биты_5 в обоих числах были нули

 
     

 

     
 

10010 &  1001111 // "И" - только 1 и 1 дают 1
                    //    англ. название   AND

      10  // это результат

// только биты_2 в обоих числах были единицы

 
     

 

     
 

10010 ^ 1001111 
/* "исключающее ИЛИ" - результат любое из пары чисел в котором инвертированы биты напротив битов равных "1" в другом числе. 

англ. название  XOR*/

         1011101  // это результат

/* изменились биты во втором числе напротив 
   установленных битов 4 и 1 первого числа. */

 
     

 

     
 

~  1001111 /* инвертировать биты 
те что были "1" станут "0" и наоборот  */

   110000  // это результат

 
     

Запомните !   Результатом поразрядных (побитных)  логических операций : &      |     ^      ~  является    число, которое может быть интерпретировано компилятором как "истина" если оно не ноль и "ложно" если число ноль.

     
 

Числа  

В компиляторе можно записывать в виде указанном в его Help'е !         Раздел - константы - Constants.

например  Целые числа могут быть записаны :

  • - в десятичной форме - 1234

  • - в двоичной форме с префиксом 0b так:  0b101001

  • - в шестнадцатеричной форме с префиксом 0x так:  0x

  • - в восьмеричной форме с префиксом так: 0775

Числа с плавающей точкой имеют в записи эту точку и какое либо число после этой точки, так:   61.234   или так:  73.0  и так:  .786  и могут иметь в конце   F   вот так: 61.234F

Цвета я применил УСЛОВНО для лучшей читаемости!

 
     

 


Различные представления числа

D3h  равно 0xD3   равно   0b1101 0011   равно  211

 

                   

шестнадцатеричное число  0xD3 

0

x

D

3

                   

двоичное представление - число 0b1101 0011

0

b

1

1

0

1

0

0

1

1

                   

номера бита

7

6

5

4

3

2

1

0

   

два в степени равной номеру бита

   

128

64

32

16

8

4

2

1

                   

число 211 в десятичном виде 
это сумма степеней двойки  где биты равны "1" 

Сложите 

+128

+64

 

+16

   

+2

+1

 
Четыре бита это 1 нибл  или  1 символ в 16-ричной системе или десятичное число от 0 до 15. 

"В уме" удобно оперировать ниблами:

двоичный

десятичный

16-ричный

0000

0

0001

1

0010

2

0011

3

0100

4

0101

5

0110

6

0111

7

1000

8

1001

9

1010

10

A

1011

11

B

1100

12

C

1101

13

D

1110

14

E

1111

15

F


Для перевода чисел из одного вида в другой можно использовать калькулятор Windows в инженерном виде.

 

Есть в Си операции которые изменяют значение переменной и без оператора присваивания :

     
 

PORTA++;   /* Эта строчка на Си означает
Взять значение переменной PORTA добавить к ней 1 и записать результат обратно в PORTA

говорят: Инкрементировать регистр PORTA */

PORTC--;      /* Эта строчка на Си означает
                обратное действие! 

Декрементировать - вычесть 1 из значения регистра PORTC  */

 
     


Инкремент и декремент удобно использовать для изменения значения различных переменных счетчиков.  
Важно помнить что они имеют очень низкий приоритет - поэтому чтобы быть уверенными в порядке выполнения желательно писать 
их отдельной строчкой программы ! 

     
 

Обратите внимание !

В конце выражения или конструкции в  программе на Си ставят точку с запятой. Длинные выражения можно писать в несколько строк. 

/* ЗЕЛЕНЫМ я пишу комментарий к программе
в Си он может быть написан в несколько
строк */

// или в одну после двух черточек

Компилятор игнорирует все что написано в комментариях. Вы не компилятор , не игнорируйте, пишите и читайте !

 
     

 

Когда инкремент или декремент используется в выражении то важно где стоят два знака + или -  перед переменной или после переменной :

     
 

a=4; 
b=7;

a = b++;   /* Эта строчка на Си означает Взять значение переменной b присвоить его переменно a затем добавить 1 к переменной b  
и сохранить результат в b. В результате a будет содержать число 7 а b будет содержать число 8  */

a=4; 
b=7;

a = ++b;   /* Эта строчка на Си означает Взять значение переменной b затем добавить к нему 1 и сохранить результат в b и этот же результат присвоить a. Теперь  a будет содержать число 8  и b будет содержать число 8     */

 
     

2)     Арифметические операции в Си 

     
 

x + y // сложение
x - y // вычитание
x * y // умножение
x / y /* деление. 

Если числа целые результат - целое число с отброшенной дробной частью - не округленноет.е. если в результате деления на калькуляторе получается 6.23411 или 6.94 то результат будет просто целое число 6  - запомните ! Если числа с плавающей точкой, то есть float или double и записываются с точкой и числом после точки, то и результат будет число с плавающей точкой */

x % y // вычислить остаток от деления нацело

// примеры:
5 / 2 
// даст 2
5
% 2  // даст 1   

 
     

3)      Операторы сравнения (или отношения): используются для сравнения переменных, чисел (констант) и выражений.

     
 

x < y  // X меньше Y
x > y  // больше
x <= y // меньше или равно
x >= y // больше или равно
x == y // равно
x != y /* не равно

Результат выполнения этих операторов: 

"истина" это "1" (точнее "не ноль")

 "ложно" это "0"  

Значения хранимые в переменных (в регистрах) х и у НЕ изменяются.

Берутся (считываются) значения хранящиеся (или содержащиеся) в переменных и сравниваются  */

! /*  "НЕ" - логическое отрицание */

 
     

4)      Логические операции :

     
 

|| // "ИЛИ" - только "ложь" и "ложь" 
  
//          дают "ложь"  


&& 
//  "И" - только "истина" и "истина" 
         //         дают "истина"   

  // "НЕ" - логическое отрицание

/*   Правило - в Си считается:

"Ложь" (False) только ноль.

"Истина"(True)- не ноль. или так:  (!0)

*/

!(истина) // дает "ложь"   

!(ложь)    // дает "истина"  

 
     


В результате логической операции вы получаете  НЕ ЧИСЛО, а логическое значение "истина" или "ложь"

Для логических операций &&  и  ||  берутся результаты выражений слева и справа от знака операции преобразованные в "истину" или "ложь" и определяется логический результат операции. Компилятор, для определенности наверно, результат "истина" превращает в 1 а не в любое отличное от 0 число.

     
 

Совет:  Используйте скобки  
( () + ( () * () ) )  

чтобы точно знать порядок выполнения 
операций программой !

 
     

Логические операции могут объединять несколько проверяемых условий. 

Например:

if((выражение1)&&((выражение2)||(выражение3))) 
{
/* 
Код программы здесь будет выполняться если: 

Выражение1 "Истина" (значит не ноль) и хотя бы одно из выражений 2 и 3 тоже "Истина" (значит не ноль).
};

Подробнее о логических операциях обязательно прочитайте по линку в низу 2-й части этой страницы !

Самое интересное - Ходовые конструкции на Си

5)     if(){}else{};  идеальная конструкция если вам нужно выполнить какую то часть программы при наличии каких либо условий : 

     
 

if (выражение) { /* делать этот код если выражение "истина" - т.е. результат его вычисления не ноль */
                }
else {
/* делать этот код если выражение "ложь" - т.е. результат его вычисления равен нулю */
             };

 
     

} else {     это не обязательный элемент конструкции :

     
 

if (выражение) { /* делать этот код если выражение "истина" - т.е. результат его вычисления не ноль */
               };        

 
     

6)      while(){}; условный цикл - используйте если вам 
нужно выполнять какой то код программы пока выполняется (существует, 
справедливо, не ноль) некоторое условие :

     
 

while (выражение) { /* делать этот код если выражение "истина" - т.е. результат его вычисления не ноль.

Пока выполняется этот код выражение не проверяется на истинность !

После выполнения кода происходит переход к строке while снова проверять истинность выражения */
                  };

 
     

Цикл while  имеет вариант do - while при котором код в  {       } выполняется по меньшей мере один раз не зависимо от истинности условия в скобках :

     
 

do { /* сделать этот код один раз 

затем, если выражение есть "истина" - т.е. результат его вычисления не ноль - опять делать код с начала, и так до тех пор пока выражение истина */
}
while (выражение);

 
     

7)      for(;;){};   - этот цикл позволяет выполнить часть  программы нужное число раз:

     
 

char i; /* объявление переменной для for

это обычная переменная и значит может иметь любое  допустимое имя по вашему желанию */

for (i=5;i<20;i+=4) {  /*  код цикла for

i=5 - это начальное выражение 

Число 5 просто для примера, может быть таким, как позволяет объявление переменной i, в нашем случае от 0 до 255

i<20 - контрольное выражение

Может быть с разными операторами отношения, важно лишь чтобы по ходу цикла оно становилось когда-то "ложью" - иначе цикл "зациклится" т.е. ни когда не кончится. 

i+=4 - счетчик

Обычно это i++ т.е.к переменной добавляется 1 каждый "прогон" цикла. Но опять же может быть таким какое вам требуется, важно лишь достижение когда либо условия абзацем выше ! Иначе цикл станет бесконечным.  

Код цикла for будет первый раз выполнен для i=5, затем по выражению i+=4, i станет 9 

теперь будет проверено контрольное выражение i<20

и так как 9<20 код цикла for будет выполнен еще раз.

Так будет происходить до тех пор пока контрольное выражение "истино" 

Когда оно станет "ложно" цикл for закончится и программа пойдет дальше.  */
                   
                };

 
     

Начальным условием - может быть любое допустимое в Си выражение результатом которого является целое число.

Контрольное выражение - определяет до каких пор будет выполнятся цикл.

Счетчик - показывает как изменяется начальное выражение перед каждом новом выполнении цикла .

циклы    for(;;)   и    while()  часто используют вот так: 

     
 

while(1)

for (;;); 

/* Так написанные эти циклы означают : 

МК выполнять эту строчку пока есть питание, нет сброса и нет прерывания.

Когда возникает прерывание, программа переходит на обработчик прерывания и (если в обработчике нет перехода в другое место программы)по завершении кода обработчика опять возвращается в такой цикл.   */

 
     

8)      switch(){};  -    оператор множественного выбора, 
позволяет вам сделать выбор из нескольких вариантов.

     
 

switch (выражение) {
case 5:
/* этот код будет выполняться если результат вычисления выражения равен числу 5 

на этом работа оператора switch закончится */
break;

case -32:
/* этот код будет выполняться если результат вычисления выражения равен отрицательномц числу -32 

на этом работа оператора switch закончится */
break;

case 'G':
/* этот код будет выполняться если результат вычисления выражения равен числу соответствующему символу G в таблице ASCII 

на этом работа оператора switch закончится */
break;

default:
/* этот код будет выполняться если результат вычисления выражения не равен ни 5 ни -32 ни 'G' 

на этом работа оператора switch закончится */
};

/* switch закончен - выполняется дальнейший код программы */

 
     

case - может быть столько сколько вам нужно, чтобы программа работала быстрее старайтесь  наиболее вероятные варианты располагать выше!

default - не обязателен.

break;  - лучше писать, иначе найдя нужный вариант программа будет проверять и следующие условия case    - напрасно тратя время.

Скачайте и Распечатайте Таблицу символов ASCII на ОДНОЙ странице !

9)      goto  - оператор безусловного (немедленного) перехода. 

     
 

mesto_5: /* сюда мы попадем после выполнения строки программы goto mesto_5   */

goto mesto_1; /* перейти в то место программы где в начале строки написано mesto_1:     */

goto mesto_5; /* перейти в то место программы где в начале строки написано mesto_5:     */

mesto_1: /* сюда мы попадем после выполнения строки программы goto mesto_1   */

 
     

goto - существует наверно во всех языках и в ассемблере в том числе. Используйте его с осторожностью!  Думайте к чему может привести выполнение функций или конструкций вашей программы не до конца. 

Например:  Если вы покинете функцию - обработчик прерывания по goto не завершив ее, то не произойдет автоматического включения прерываний глобально - т.е. не установится бит  I  в регистре SREG, Этот бит устанавливается автоматически после полного выполнения функции обработки прерывания и "естественного" выхода из неё. 

Ну вот - ПОЧТИ всё что нужно нам из Си ! Как использовать описанное выше вы можете  посмотреть в примерах к компилятору ! Примеры в папке :

C:\CVAVR\EXAMPLES

Открывайте файлы  .с  и разбирайте текст программ - что делает каждая строчка! Это великолепный способ само- обучения программированию !

Структура   программы на  языке  Си

Программа на языке Си это текстовый файл с расширением  .c 

Текст программы называют исходным или "исходником" или "сурцом" от анг. source code - это вам ключевые слова для поиска ! 

"Исходник" на Си имеет определенную структуру :

 

Глобальные переменные   

- объявляются вне какой либо функции.
 
    т.е. не после фигурной скобки {

-  доступны в любом месте программы - значит можно читать их значения и присваивать им значения там где требуется. 

5) описание функций - обработчиков прерываний

6) описание других  функций используемых в программе

7) функция  main  - это единственный обязательный пункт !

 

     
 

Это не жесткий порядок а ориентировочный ! 

Иногда п.6 это прототипы функций, а сами функции описываются полностью после п.7 

Прототип функции - показывает образец того как применять функцию в программе, какие значения в нее передаются и если она возвращает какое-то значение то прототип указывает тип возвращаемых данных. Прототип не имеет скобок {     }  а после скобок (   ) ставится  

Функция - имеет { "тело" } в фигурных  скобках. Тело это код на Си определяющий то что делает функция.  

; после функции не ставится. 

 
     



Программа на Си начинает работу с функции main(), по необходимости из main()вызываются другие функции программы,  по завершении работы функции программа возвращается в main() в то  место от куда функция была вызвана. 

main(){

... какой то код программы ...

вызов функции_1; //программа перейдет в функцию_1

строка программы; // будет выполнятся после 
                  // возврата из функции_1 


... какой то код программы ...

}

функции могут вызываться не только из main() но и из других функций.


Пример программы на Си  

с описанной выше структурой я  буду писать на голубом фоне. 

По мере надобности я буду разрывать голубой фон обычным текстом, затем голубой фон и программа будет продолжаться. 

     
 

/* п.1 заголовок программы

Он оформляется как комментарий, и обычно содержит информацию 

- о названии, назначении, версии и авторе программы 
- краткое описание алгоритма программы 
- пояснения о назначении выводов МК 
- другие сведения которые вы считает полезным указать  
*/

// комент. после двух косых черт пишут в одну строку!

 

//п.2 включение внешних файлов 

#include <mega16.h>
/* перед компиляцией, препроцессор компилятора вставит вместо этой строчки содержимое (текст) заголовочного файла "хидера" mega16.h - этот файл содержит перечень регистров имеющихся в МК ATmega16 и соответствие их названий их физическим адресам в МК.

Посмотрите его содержание 

CVAVR\inc\mega16.h           */


//delay functions
#include <delay.h> 
/* перед компиляцией, препроцессор компилятора вставит вместо этой строчки текст "хидера" delay.h - этот файл содержит функции для создания пауз в программе.

Теперь чтобы сделать паузу вам нужно лишь написать :

delay_ms(x); // сделать паузу x милиСек 
delay_us(x); // сделать паузу x микроСек 

x - число от 0 до 65535 (тип unsigned int)      */

 

//п.3 определения пользователя

// AD7896 control signals PORTB bit allocation
#define ADC_BUSY PINB.0
#define NCONVST PORTB.1
/* после этих двух строк, перед компиляцией, препроцессор компилятора заменит в тексте программы ADC_BUSY на PINB.0 и NCONVST на PORTB.1 

Таким образом вместо того что бы помнить что вывод занятости AD7896 подключен у вас к ножке PB0 вы можете проверять значение осмысленного понятия ADC_BUSY - "АЦП занят" 

а вместо управления абстрактной ножкой PB1 (через PORTB.1) вы можете управлять "НьюКонвешнСтат" - NCONVST - "стартовать новое АЦ преобразование"

#define   -   Это   удобно ! 
но ВОВСЕ не обязательно.
 
  

 
*/

#define INIT_TIMER0 TCNT0=0x100L-F_XTAL/64L/500L 
// этот пример показывает что определения 
// могут быть и сложней ! 

 
     


Определения (соответствие номера бита в регистре его названию по ДШ) отдельных битов есть в "хидерах"   .h в ICC, IAR и других компиляторах,  но их нет в хидерах  CodeVisionAVR Поэтому я сделал для вас файл - заголовок   m8_128.h  скачайте его и добавьте в программу вот так:

#include <mega16.h> //сперва обычный хидер

#include <m8_128.h> //мой хидер для битов

Теперь вы можете использовать примеры на Си из ДШ на соответствующий МК !  Мой файл  m8 128.h  содержит определения битов для микроконтроллеров ATmega8   ATmega16   ATmega32   ATmega64   ATmega128 

 

     
 

Мастер начального кода программы в компиляторе ICC умеет по вашему желанию автоматически делать #define для ножек МК !Подробней про это и с картинкой смотри в соответствующей задаче курса.

 
     

#define - может содержать и некоторые переменные, вместо которых в тексте программы могут быть подставлены и числа и слова. 

Например: 

#define invbit(p,n) (p=p^bit(n))

Здесь переменные величины это 'p' и 'n'.  Кроме того в самой правой части эти переменные величины могут быть связаны и арифметическими операциями и таких переменных может быть много.

Язык Си для МК

часть 2 

 

Объявление  переменных 

Перед использованием переменной в программе на Си  её  необходимо объявить - т.е. указать компилятору какой тип данных она может хранить и как она называется.Наиболее подробно об этом по ссылке: 1.2. ТИПЫ ДАННЫХ И ИХ ОБ ЯВЛЕНИЕ. Ниже сжато - самое главное:

Формат объявления переменной таков:

[<storage modifier>] <type definition> <identifier>;

 

     
 

[<storage modifier>]- необязательный элемент, он нужен только в некоторых случаях и может быть: 

extern - если переменная объявляется во внешнем файле - например в хидере   delay.h  приведенном выше. 
volatile - ставьте если нужно предотвратить возможность повреждения содержимого переменной в прерывании, и не позволить компилятору попытаться выкинуть её при оптимизации кода. 
Советую ставить если не знаете точно нужно или нет !  

пример:
volatile unsigned char x;

static - если переменная локальная т.е. объявлена в какой либо функции и должна сохранять свое значение до следующего вызова этой функции. 

flash и eeprom - используются с указателями. 

 
     

Глобальные переменные объявляются до появления в тексте программы какой либо функции. Глоабльные переменные доступны в любой функции программы. 

Локальные переменные объявляются в самом начале функций  - т.е. сразу после фигурной скобки  "{". Локальные переменные доступны только в той функции где они объявлены!  В разных функциях могут быть объявлены локальные переменные с одинаковыми именами - я не советую вам так делать. Советую не использовать ЛОКАЛЬНЫЕ переменные в главной функции main.

<type definition> - тип данных которые может хранить переменная.

наиболе часто используемые типы данных :

Подробнее все типы данных посмотрите в Help CVAVR\bin\CVAVR.HLP  Раздел "Data Types"  

     
 

Вместо unsigned char - можно писать писать просто  char, так как компилятор по умолчанию считает char  без знаковым байтом. А если вам нужен знаковый байт то объявляйте его так :

signed char  imya_peremennoi;

 
     

 
<identifier> - имя переменной - некоторый набор символов по вашему желанию, но не образующий зарезервированные слова языка Си.

Выше был уже пример идентификатора - имени переменной:  

imya_peremennoi

 

     
 

Желательно давать осмысленные имена переменным и функциям - напоминающие вам об их назначении. 

принято использовать маленькие буквы, а для отличия имен переменных от названия функций - имена переменных можно например начинать с буквы, а названия функций (кроме main конечно) с двух символов подчеркивания. 

Например так :  

  moya_peremennaya        __vasha_funkziya

 
     

Внимание! Глобальные переменные, а также локальные с модификатором static - при старте и рестарте программы равны 0 если вы не присвоили им (например оператором =) иное значение при их объявлении или по ходу программы.Подробные примеры объявления переменных посмотрите пожалуйста в разделе Variables в "Хелп" компилятора.   Вот несколько примеров объявления переменных :

unsigned char my_peremen = 34;
unsigned int big_peremen = 34034;

Это объявлены две переменные и им присвоены значения.

Первая   my_peremen - символьного типа - это 1 байт, она может хранить число от 0 до 255. В данном случае в ней хранится число 34.

Вторая  big_peremen  - целого типа, два байта, в ней может хранится число от 0 до 65535 , а в примере в  неё поместили десятичное число 34034.

Пример массива содержащего  3 числа или элемента массива.

char mas[3]={11,22,33};

Нумерация элементов начинается с  0. Т.е. элементы данного массива называются

mas[0], mas[1], mas[2]

и в них  хранятся десятичные числа 11,  22 и 33.

Где то в программе вы можете написать:

mas[1] = 210;

Теперь  в  mas[1] будет хранится число  210

- массивы могут быть многомерными,
- можно не присваивать значений элементам  массива при объявлении

НО только при объявлении вы можете присвоить значения всем элементам массива сразу ! Потом это можно будет сделать только индивидуально для каждого элемента.

 

Строковая переменная  или массив содержащий строку символов.

char stroka[6]="Hello";

Символов (букв) между кавычками  5 , а я указал размер строки 6  !

Дело в том, что строки символов должны заканчиваться десятичным числом 0.

Не путайте его с символом '0' которому соответствует десятичное число 48 по
таблице ASCII  - которая устанавливает каждому числу определенный символ.

Например :

Элемент строки  stroka[1] содержит число 101  которому по таблице ASCII  соответствует символ 'e'
Элемент stroka[4] содержит число 111  которому соответствует символ 'o'
Элемент   stroka[5] содержит число 0  которому соответствует символ  
'NUL'  его еще обозначают вот так  
'\0'

Строковая переменная может быть "распечатана" или выведена в USART MK вот так:

printf("%s\n", stroka); 

     
 

Вы можете преобразовать строковую переменную в число  ! Если исходная строка символов такая  :

char stroka[]="3654694";

то вот так:

perem_1 = atoi(stroka);

мы поместим в переменную  perem_1   (которую должны были ранее в программе объявить как  "беззнаковую целую") число 36546. 

Это число влезет в переменную perem_1 которая может хранить числа от 0 до 65535.А вот 9 и 4 уже не поместятся.Для бОльших чисел есть функция   -   atol() Чтобы использования эти функции необходимо включить в начале программы заголовочный файл :

#include <stdlib.h>

Для преобразования числа в строку

есть  itoa()  и  ltoa()


Подробнее об этих и других полезных функциях смотрите раздел "Standard Library Functions"  справки компилятора.

 
 

 

 

Советую вам скачать  заголовочный файл m8 128.h  Он содержит названия битов МК ATmega8  -16 -32 -64 -128 и сокращенные названия типов данных как в компиляторе IAR. вот отрывок из  него:

#define u8 unsigned char // 0 to 255
#define s8 signed char // -128 to 127

#define u16 unsigned int // 0 to 65535
#define s16 signed int // -32768 to 32767

#define u32 unsigned long int  // 0 to 4294967295

#define s32 signed long int  // -2147483648 to 2147483647

#define f32 float // ±1.175e-38 to ±3.402e38
#define d32 double // ±1.175e-38 to ±3.402e38


После включения моего  "хидера"  в текст вашей 
программы вы сможете писать вместо длинного

unsigned long int <имя 32 битной переменной>

коротко :  

Следующий пункт в структуре программы на Си для МК ...

 

     
 

/* п.5  описание функций - обработчиков прерываний Подробно о прерываниях в AVR читайте на стр. 3 курса ! мы будем использовать в   ЭТОЙ программе - только одно прерывание и значит одну функцию обработчик прерывания. Программа будет переходить на неё при возникновении прерывания : 

ADC_INT - по событию "окончание АЦ преобразования"  */

interrupt [ADC_INT] void adc_isr(void)
{ 

PORTB=(unsigned char) ~(ADCW>>2);
/* отобразить горящими светодиодами подключенными от + питания МК через резисторы 560 Ом к ножкам порта_B  старшие 8 бит результата аналого-цифрового преобразования  */

/* сделаем паузу 127 мСек чтобы в реальном устройстве можно было увидеть переключение светодиодов  */
delay_ms(127); 

/* В реальных программах старайтесь не делать пауз в прерываниях! Обработчик прерывания должен быть как можно короче и быстрее   */

 // начать новое АЦ преобразование
ADCSRA|=0x40;

} // закрывающая скобка для обработчика прерывания

 
     

Функция обработчик прерывания может быть названа вами  произвольно - как и любая функция кроме  main
Здесь она названа :        adc_isr 

При каком прерывании ее вызывать - компилятор узнает из строчки : 

interrupt[ADC_INT]  

по первому зарезервированному слову - interrupt - он узнаёт, что речь идет об обработчике прерывания, а номер вектора прерывания (адрес куда физически, внутри МК перескочит программа при возникновении прерывания) будет подставлен вместо ADC_INT препроцессором компилятора перед компиляцией - этот номер указан в подключенном нами ранее заголовочном файле ("хидере") описания "железа" МК - mega16.h - это число сопоставленное слову ADC_INT.

Очень информативна и тем ценна для обучающегося следующая строка программы:

PORTB = (unsigned char) ~(ADCW>>2);

Давайте проанализируем как она работает.

=     оператор присваивания.  Он означает присвоить значение выражения
справа от оператора присваивания той переменной что указана слева от него. 

Значит нужно вычислить выражение справа и поместить 
его в переменную  PORTB.

Вычислим что справа от оператора присваивания.

ADCW - это переменная слово (двухбайтовая величина - так она объявлена в файле mega16.h) в котором CodeVisionAVR сохраняет 10-битный результат АЦП - а именно в битах9_0 (биты с 9-го по 0-й) т.е. результат выровнен обычно - вправо. 

Но у нас, в VMLAB только 8 светодиодов и нужно отобразить 8 старших бит результата - т.е. биты_9_2  - для этого мы сдвигаем все биты слова ADCW  вправо на 2 позиции

ADCW >> 2 /* биты 1 и 0 вылетают вправо из числа в небытие, 
бит_9 перемещается в позицию бит_7, бит_8 в позицию бит_6 и так далее до бит_2 становится бит_0  */

Теперь старшие 8 бит результата АЦП встали в биты7_0
младшего байта  (LowByte - LB) слова ADCW

       
 

>> n

означает сдвинуть все биты числа вправо на n  позиций это равносильно делению на 2 в сепени n

 
 

 

 

 
 

<< n

означает сдвинуть все биты числа влево на n позиций это равносильно умножению на 2 в сепени n

 
       
 

Сдвиг используется очень часто !

 
 

 

 

Светодиоды подключены так как написано выше - т.е.  подключены правильно !

Загораются (показывая "1") при "0" на соответствующем выводе МК - значит нам нужно выводить в PORTB число в котором "1" заменены "0" и наоборот  -  это делает как я рассказал выше :

~           операция побитного инвертирования

Значит результатом этого выражения

 ~(ADCW>>2)

будут инвертированные 8 старших бит результата АЦП находящиеся в младшем (правом - LB) байте двух байтового слова ADCW


Выше я уже говорил что : 
в Си в переменную можно помещать только тот тип данных который она может хранить !

Так как PORTB это байт, а ADCW - это два байта, то прежде чем выполнить оператор присваивания (это знак  = ) нужно преобразовать слово (слово - word - значит два байта)  ADCW  в без знаковый байт.

     
 

Преобразование типов данных - делают так :

перед тем что надо преобразовать записывают в скобках (       ) 
тип данных к которому нужно преобразовать.

 
 

 

 


Пишем ...

(unsigned char) ~(ADCW>>2)

Результат этой строки - один байт и мы можем поместить его в PORTB

Если в регистре DDRB все биты равны "1" - т.е. все ножки порта_B выходы, мы безусловно увидим старшие 8 бит результата АЦП горящими светодиодами.

Вам должна быть абсолютно понятна разобранная строка:

PORTB = (unsigned char) ~(ADCW>>2);

Если это не так то повторите разбор, и почитайте рекомендованное ниже по Си.

разберем еще одну строчку :

ADCSRA|=0x40;

обратите внимание на необходимость ставить в конце выражений точку с запятой - не забывайте ! Эта строка означает следующее:  
Двигаемся слева на право :

так как в результате поразрядного  ИЛИ только два "0" дают "0" биты в ADCSRA напротив нулей не изменятся, а вот бит_6 в  ADCSRA оказывается напротив "1" и теперь он станет "1" не зависимо от того каким он был до этого !

т.е. смысл рассматриваемой строки программы 

ADCSRA|=0x40;

"установить" (т.е. сделать "1") бит_6  в  регистре ADCSRA

     
 

Число справа от составных операторов      |=   &=   ^= обычно называют маской

и говорят "наложить маску" - так как в результате меняются лишь те биты которые нужно изменить.

 
 

 

 


Для обнуления нужных бит используют обозначаемое знаком 
& поразрядное логическое И   -  только "1" и "1" дает "1"

PEREM &=(~0x04); // обнулить бит_2 в переменной PEREM

Скобки здесь я добавил для улучшения читаемости кода.

Самоконтроль - важно:

а) обязательно разберитесь почему обнуляется бит_2

б) Как в двоичном виде выглядит результат  (~0x04) 

 

     
 

 /* п.6     функции используемые в программе */

// их может быть столько сколько вам нужно.

// у нас будет одна, кроме main и 
// обработчика прерывания.

/*  =================================

Это будет функция в которой описано начальное 
конфигурирование МК в соответствии с 
поставленной задачей 

Удобно над функцией сделать заголовок
подробно поясняющий назначение функции !


=====================================  */

(void)__init_mk(void) {
/* Вначале любой функции объявляются 
ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ - если конечно они вам нужны */

/* void - означает пусто. 

Перед названием функции - void - означает что функция не возвращает ни какого значения. А в скобках после названия означает что при вызове в функцию не передаются ни какие значения.  */

// инициализация Port_B 
DDRB=0xFF;  // все ножки сделать выходами
PORTB=0xFF;
// вывести на все ножки "1"

 

/* настройка АЦП - производится записью определенного числа в регистр "ADC Control and Status Register A" – ADCSRA

посмотрите его описание в ДШ МК мега16.

Нам нужно: 

- Включить модуль АЦП

- Установить допустимую частоту тактирования АЦП при частоте кварца 3.69 МГц  - мы выберем коэф. деления 64 - это даст частоту такта для процессов в АЦП  57.656 КГц

- Включить прерывание по завершению АЦ преобразования.

По ДШ для этого нужно записать в регистр ADCSRA
число:  1000 1110  или 0х8E  */

// ADC initialization w Oscillator=3.69MHz
// ADC Clock frequency: 57.656 kHz
// ADC Interrupts: On

ADCSRA=0x8E;

 

/* Теперь выбираем вход АЦП ADC0 (ножка PA0) и внешнее опорное напряжение (это напряжение код АЦП которого будет 1023) с ножки AREF 

Смотрим что нужно записать для этого в регистр 
мультиплексора (выбора входа) АЦП ADMUX  

см. ДШ
*/ 

// Нужно записать 0 (он там по-умолчанию)
ADMUX=0;



/* Разрешаем ГЛОБАЛЬНО все прерывания 
      разрешенные индивидуально ! 

Вы наверно поняли что индивидуально мы разрешили 
лишь прерывание по завершении АЦП - вот оно то и 
сможет возникать у нас.  */

#asm("sei")

 
     

 

Внимание ! так делаются вставки ассемблерных инструкций:

#asm("инструкция на ассемблере")

Обратите внимание - точки с запятой НЕТ ! Такие вставки принято иногда делать  НО они не являются необходимыми,  На   Си   можно управлять ВСЕМИ программно изменяемыми битами в регистрах МК !

     
 

Напоминаю ...    Все регистры МК перечислены в конце ДШ с указанием номеров страниц с подробным описанием регистра и его битов.

 
 

 

 

 

Но почему-то часто используются такие строки:

#asm("sei") // Разрешить ГЛОБАЛЬНО все прерывания

#asm("cli") // Запретить ГЛОБАЛЬНО все прерывания

#asm("nop") // Пауза в 1 такт процессора 

#asm("wdr") // Сбросить сторожевой таймер

     
 

// все функция закончена
} // скобка закрывающая для функции __init_mk() 

 
     


Далее...

     
 

/* 
п.7    главная функция  main()  - обязательная ! 
*/

/*  =================================
Главная функция - 

Си программа начинает выполнятся с нее!

=====================================  */

void main(void){
/* Вначале любой функции объявляются 
   (если нужны)  ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ  */

__init_mk();/*Вызываем функцию инициализации, настроийки аппаратуры МК. Выполнив ее программа вернется сюда и будет выполнять 
следующую строку  */

// запускаем первое АЦП 
ADCSRA|=0x40;

// бесконечный цикл в ожидании прерываний 
while(1);
/* Программа будет крутится на этой строчке постоянно проверяя истинно ли условие в 
скобках после while а так как там константа 
1 - то условие будет истинно всегда!

  // функция main закончена
} // скобка закрывающая для функции main() 

 
     

 

Теперь программа будет работать так : 

По завершении АЦП будет возникать прерывание и программа будет перескакивать в функцию обработчик прерывания  adc_isr(), при этом будут автоматически запрещены все прерывания ГЛОБАЛЬНО !В конце  adc_isr() запускается новое АЦ преобразование и при выходе из обработчика прерывания снова разрешаются глобально прерывания, и программа возвращается опять в бесконечный цикл  while(1) .Такая чехарда будет продолжаться пока есть питание МК и не будет сброса.  Светодиоды будут высвечивать 8-ми битный код АЦП напряжения на ножке PA0  

Еще щепотка  Си :

Пример:  делать что-то  пока на ножке PBn есть "1" 

while(PINB & (1 << n)){
                       
что-то    
/* что-то будет выполнятся снова и снова, пока проверка условия в скобках после while будет давать "истину" - значит пока на ножке PBn есть логическая единица  */
                                              };

примечание  -  в CVAVR можно написать проще  
while(PINB.n){

Пример:  выполнить что-то если  на ножке PCn есть "0" 

if((~PINC)&(1 << n)){
                    
что-то
                                       /* что-то начнет выполняться если 
                     на ножке
PCn был "0" */
                                               };

примечание  -  в CVAVR можно написать проще  
while(!(PINB.n)){


Помните !     
Выполнение  чего-то  может быть прервано прерыванием.
После завершения обработки прерывания выполнение чего-то продолжится.

 

примечание  -

Условие : 

if((~PINC)&(1 << n)) {

можно записать и вот так : 

if(!(PINC & (1 << n))) {

 

     
 

К  битам  регистров с адресами от 0 до 31 в компиляторе CodeVisionAVR можно обратится (и читать и записывать) проще.

Вот так:     REGISTR.BIT  

 
 

 

 

Пример:   PINB.2   или   PORTA.5 

Пример:
if(!PINB.2){

                этот код /* Если на ножке PB2 низкий 
логический уровень - то выполнить
этот код */
                            };   

Пример:
PORTA.3 = 1; /* Сделать бит 3 в регистре 
PORTA единицей - говорят: "установить бит" 
по англ. "set bit" */

     
 

Битовые операции подробно описаны в задаче 1 и конечно в  help  компиляторов ! 

 
 

 

 

 

Всё программа на Си написана. Вам должно быть все ясно и  абсолютно понятно. Если это не так то перечитайте, подумайте, повторите разбор, почитайте рекомендованное ниже по Си.

Теперь вы должны знать 

 

Язык Си - дополнительная литература


Очень доступно о Си рассказано здесь: 

Андрей Богатырев. Руководство полного идиота
по программированию на языке Си
 

обязательно используйте его при работе! и заглядывайте в него. 

  Статья "Си без Си" уважаемого и очень опытного микроконтроллерщика - ник: Bill http://www.caxapa.ru/story/bill_1.html

Очень советую вот это:  

Ю.Ю.Громов, С.И.Татаренко

ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ СИ

В пособии приведено подробное описание наиболее распространенного языка программирования Си для персональных компьютеров, совместимых с IBM PC, и описано применение средств языка на примерах задач работы со списками.

Учебное пособие предназначено для студентов всех специальностей, аспирантов и инженерно-технических работников использующих вычислительную технику. 

Может быть использовано как справочное пособие для широкого круга программистов, как профессионалов, имеющих большой опыт работы на Си, так и начинающих программировать на Си.

 

ОГЛАВЛЕНИЕ

1.ОПИСАНИЕ ЯЗЫКА СИ

1.1. ЭЛЕМЕНТЫ ЯЗЫКА СИ
1.1.1. Используемые символы
1.1.2. Константы
1.1.3. Идентификатор
1.1.4. Ключевые слова
1.1.5. Использование комментариев в тексте программы

1.2. ТИПЫ ДАННЫХ И ИХ ОБ ЯВЛЕНИЕ
1.2.1 Категории типов данных
1.2.2. Целый тип данных
1.2.3. Данные плавающего типа
1.2.4. Указатели
1.2.5. Переменные перечислимого типа
1.2.6. Массивы
1.2.7. Структуры
1.2.8. Объединения (смеси)
1.2.9. Поля битов
1.2.10. Переменные с изменяемой структурой
1.2.11. Определение объектов и типов
1.2.12. Инициализация данных

1.3. ВЫРАЖЕНИЯ И ПРИСВАИВАНИЯ
1.3.1. Операнды и операции
1.3.2. Преобразования при вычислении выражений
1.3.3. Операции отрицания и дополнения
1.3.4. Операции разадресации и адреса
1.3.5. Операция sizeof
1.3.6. Мультипликативные операции
1.3.7. Аддитивные операции
1.3.8. Операции сдвига
1.3.9. Поразрядные операции


1.3.10. Логические операции

 

     
 

Я обнаружил ошибку в разделе 1.3.10 

правильно вот так: 

Операция логического И (&&) вырабатывает значение 1 если оба операнда имеют НЕнулевые значения.

 
 

 

 


1.3.11. Операция последовательного вычисления
1.3.12. Условная операция
1.3.13. Операции увеличения и уменьшения
1.3.14. Простое присваивание
1.3.15. Составное присваивание
1.3.16. Приоритеты операций и порядок вычислений
1.3.17. Побочные эффекты
1.3.18. Преобразование типов

1.4. ОПЕРАТОРЫ
1.4.1. Оператор выражение
1.4.2. Пустой оператор
1.4.3. Составной оператор
1.4.4. Оператор if
1.4.5. Оператор switch
1.4.6. Оператор break
1.4.7. Оператор for
1.4.8. Оператор while
1.4.9. Оператор do while
1.4.10. Оператор continue
1.4.11. Оператор return
1.4.12. Оператор goto

1.5. ФУНКЦИИ
1.5.1. Определение и вызов функций
1.5.2. Вызов функции с переменным числом параметров
1.5.3. Передача параметров функции main

1.6. СТРУКТУРА ПРОГРАММЫ И КЛАССЫ ПАМЯТИ
1.6.1. Исходные файлы и объявление переменных
1.6.2. Объявления функций
1.6.3. Время жизни и область видимости программных объектов
1.6.4. Инициализация глобальных и локальных переменных

1.7. УКАЗАТЕЛИ И АДРЕСНАЯ АРИФМЕТИКА
1.7.1. Методы доступа к элементам массивов
1.7.2. Указатели на многомерные массивы
1.7.3. Операции с указателями
1.7.4. Массивы указателей
1.7.5. Динамическое размещение массивов

1.8. ДИРЕКТИВЫ ПРЕПРОЦЕССОРА
1.8.1. Директива #include
1.8.2. Директива #define
1.8.3. Директива #undef

2. ОРГАНИЗАЦИЯ СПИСКОВ И ИХ ОБРАБОТКА

2.1. ЛИНЕЙНЫЕ СПИСКИ
2.1.1. Методы организации и хранения линейных списков
2.1.2. Операции со списками при последовательном хранении
2.1.3. Операции со списками при связном хранении
2.1.4. Организация двусвязных списков
2.1.5. Стеки и очереди
2.1.6. Сжатое и индексное хранение линейных списков

2.2. СОРТИРОВКА И СЛИЯНИЕ СПИСКОВ
2.2.1. Пузырьковая сортировка
2.2.2. Сортировка вставкой
2.2.3. Сортировка посредством выбора
2.2.4. Слияние списков
2.2.5. Сортировка списков путем слияния
2.2.6. Быстрая и распределяющая сортировки

2.3. ПОИСК И ВЫБОР В ЛИНЕЙНЫХ СПИСКАХ
2.3.1. Последовательный поиск
2.3.2. Бинарный поиск
2.3.3. М-блочный поиск
2.3.4. Методы вычисления адреса
2.3.5. Выбор в линейных списках

2.4. РЕКУРСИЯ

Чтение по порядку глав

 

Вообще сайт СитФорум по программированию ПК рулит!


Повторю:  

Отличное руководство по Си для AVR это HELP в компиляторе CodeVisionAVR 

Читайте его и ищите в нем интересующее вас по ключевым словам.

Задачи-упражнения 
по краткому курсу AVR

 

Чтобы двигаться дальше вам нужны  программы:

Если это так: Приступайте  к  работе!

Задачи-упражнения  курса  -  это практические занятия, примеры по написанию программ для AVR с сопутствующим
кратким изложением необходимых теоретических сведений сопровождаемым скриншотами программ. Поверьте просто читать задачи - пользы МАЛО ! 
Как читать самоучитель игры на пиано или гитаре не тренируясь на инструменте: сколько не читай - играть ни фига не научишься ...  

Задачи нужно проделать читая, прочувствовать - только так!  

Большинство задач могут быть выполнены виртуально, на ПК. Вам не нужно покупать МК и что-то паять, что либо сжигать и вдыхать пары флюса...

Задача 1

Задача 2 

Задача 3  

Задача 4

 

Задача 5

Задача 6 

 

Задача 7   

Помнить все! добавляем 2 Мб памяти - быстрой и не забывающей информацию при отключении питания - стоит всего 5 баксов. Подключение AT45DB161 к МК AVR по SPI со схемой и программой на Си с подробными комментариями.

 

Задача  8


Задача  9

 

Задача 9 часть 2 

Проектирование входной цепи для сигнала

 

Задача 10

  • Устройство изменяющее состояние нагрузки при громком звуке длительностью от 5 до 20 мС. 

  • Цель задачи: разработать устройство и программу для МК ATmega16 которое будет анализировать длительность сигнала от микрофона и если она будет лежать в пределах 5-20 мС то будет менять состояние подключенной нагрузки: если была выключена - то включит и наоборот.

    Задача повторяет-закрепляет навык генерации начального кода программы в компиляторе CodeVisionAVR для ATmega16.

    Задача 11

    АЦП - аналоговый сигнал преобразуем в Цифровой код при помощи 10 битного АЦП встроенного (там целых 8 каналов!) в МК  AT90s8535. Программу пишем на CodeVisionAVR, компилируем и затем отладим в эмуляторе с наблюдением движения программы по тексту на Си. 


    Приступайте  к работе! Того что есть вполне достаточно для уверенного старта, остальное в
    АпНоутах и в Интернете навалом.

     
    А какой AVR выбрать для поделок ? 
    их там много...
     

     

    Вы не спец и надеюсь не собираетесь делать серийное устройство, соответственно вопросы конкурентной борьбы и цены МК в серии вас не сильно волнуют - вам похоже нужно комфортно, без изворотов и ухищрений, получить быстрый результат. 

    Я уже давал совет на 1-й странице курса,  здесь дополню: 

    Комфортно касательно МК - это когда много памяти и ножек (выводов, пинов) чтоб не сталкиваться с их не хваткой. 

    Комфортно когда на одном МК вы сможете сделать и то что вам надо сейчас и надо будет сделать потом и легко что-то  добавить в работающую систему. 

    Советую вам выбрать универсальный МК - пусть он будет один у вас - зато вы сможете хорошо его узнать и не тратить время на изучение разных МК под каждый следующий проект. 

    Используйте ATmega16 (-32 -64 -128) 

    ATmega16  недорогой, выпускается в 40-ка выводном удобном для самоделкиных корпусе DIP-40 с шагом ножек 2.54 мм. длина МК - 53 мм ширина 17 мм. 

    Если вы выбрали другой AVR -  ни чего страшного, так как это именно семейство МК, все они имею одинаковый набор инструкций и программы легко переносятся с одного на другой с минимальной - однако необходимой! корректировкой.

    После выбора МК Вам необходимо скачать ДатаШит (ДШ) на него (DataSheet.pdf) - это паспорт МК в нем есть "Errata" - описание уже обнаруженных ошибок МК - про него не забывайте! 

    Идеально распечатать и изучить весь ДШ - но я понимаю, что сделать это не просто, он ведь большой. 

    Поэтому
    настоятельно прошу вас распечатать стр. 1-5 и раздел "Register Summary" (примерно стр. 329-330) - это список регистров МК и ссылки на номера страниц с их подробным описанием.

    Скачивайте свежий ДШ !

     

    Краткие рекомендации по созданию 
    электронных устройств.

     

    Обычно первый монтаж устройства выполняют на макетных платах (а в случае единичного устройства такой монтаж бывает и окончательным вариантом).   

    Здесь посмотрите варианты простых макетных плат от 
    OLIMEX 

    там же есть интересные проекты устройств на AVR!


    Такие макетные платы продаются в магазинах компонентов,
    а схемы свободно доступны на сайте.


    Макетка -
    это обычная печатная плата содержащая множество отверстий обычно с шагом 2.54 мм, с одной (реже с двух) стороны вокруг отверстий есть луженые медные площадки.  

    Компоненты вставляют ножками в отверстия а с обратной стороны производят соединения гибким монтажным проводом. Вот пример монтажа устройства  на макетной плате: (Это JDM-программатор для МК PIC и устройств с интерфейсом i2c )

     

    На монтажной плате желательно размещать компоненты с одной стороны а все проводники с другой, получается очень аккуратный и качественный монтаж. 

    Если сторону проводников после тестирования, промыть от флюса растворителем, просушить и залить компаундом или лаком - то устройство наверняка будет работать долго и надежно.

    Чтоб не забыть запаять какой то проводник,  удобно зачеркивать карандашом на бумажном рисунке схемы устройства каждое сделанное соединение.

    Очень удобно конденсаторы и резисторы брать чипы размера 0805 и 0603 и паять прямо на ножки компонентов.
     

     

    Немного о пайке: 

    • Электроника наука о контактах! это очень точное определение, большинство отказов правильно спроектированных устройств вызвано отсутствием электрического контакта там где он должен быть и наоборот.

    • Пайка основной вид неразъемных электрических соединений применяемый в электронике - поэтому вы легко можете найти материалы по тому как паять правильно.

    • Важно чтоб паяльник имел нужную температуру! 

    • Используйте регулятор нагрева паяльника. Например комнатный выключатель света с плавной регулировкой яркости. Установите его в блок розеток удлинителя вместо одной розетки - это очень удобно.

    • Припой должен как бы сам формировать аккуратную спайку, не должно требоваться размазывание спайки. 

    • Жало паяльника должно быть достаточно горячим, чтоб припой не тянулся за паяльником а образовывал сглаженную поверхность, припой на паяльнике должен блестеть и довольно долго не тускнеть. 

    • Пайку нужно делать не мгновенно! Надо коснутся жалом с припоем площадки около контакта компонента, прогреть площадку около ножки и затем подводить жало к ножке... всего 2-4 сек. примерно. Нужен опыт конечно. 

    • Жало почаще протирайте сложенной в несколько слоев хб тряпочкой и при выгорании затачивайте напильником и залуживайте. 

    • Я затачиваю жало паяльника как классическое жало плоской отвертки, только угол между гранями больше - примерно 30 градусов, а ширина жала около 3 мм для большинства работ. Жало простое медное диаметром 4.5 мм. Второе жало, аналогичное но с шириной всего 1 мм - это для пайки компонентов для поверхностного монтажа размеров 0603 и 0805 и микросхем с шагом от 0.5 мм. Таким образом я всю пайку выполняю паяльником на 40 Вт  с двумя сменными жалами.

    • Желательно использовать не канифоль а активный флюс (он типа вазелина бывает), или паяльную пасту - она с припоем уже.

    • Плату после пайки промойте кисточкой растворителем в наклонном положении. 

    Подробно: Припои флюсы способы пайки - статья в FAQ'е курса

     




      Очень рекомендую прочитать! Руководство по правильной разводке  печатных плат и проводов в устройстве Подробно разъяснено происхождение, излучение и влияние электромагнитных помех и методы их снижения для обеспечения EMC.

    Внимание !  Удобно купить мощный многоногий МК уже припаянный на плату с некоторыми нужными дополнительными элементами.  вот ATmega128 к примеру, на плате:

    USB встроен и прочие приятности - документация тут.

    в отверстия по краю платы впаяйте гребенки штырьков или гнезд и затем к ним подключайте без пайки разъемы с проводами, либо ставьте на ответные части разъема впаянные в плату основного устройства или на большую макетную плату. 

      Аналогичный модуль от Olimex 

     

     

    подешевле но и возможностей поменьше, зато контакты по краю платы уже запаяны.

    А вот подороже но и по-навороченей: (Тестовая программа для платы ) :

     


    Более качественный монтаж можно выполнить изготовив специальную плату для вашего устройства - обычно это делают уже отладив устройство в симуляторе и/или на макетной плате. 
    Вот примерный вид рисунка печатных проводников для переноса на плату:

     

    А вот тот же программатор JDM, но собранный на специальной печатной плате со сверлением:

    Для рисования схем и "разводки" (размещение компонентов на плате и прокладка соединяющих дорожек) печатной платы устройства рекомендую  - мощная и очень популярная у электронщиков программа рисования схем и "разводки" (размещение компонентов на плате и прокладка соединяющих дорожек) печатной платы устройства: EAGLE  (Она бесплатна для плат достаточно большого размера.)
      Программа автоматически размещает компоненты на плате и может развести дорожки сама. Вам нужно только нарисовать схему, выбрать корпуса для всех компонентов и задать размеры платы. 
    На сайте вы можете скачать дополнительные библиотеки электронных компонентов и различные микроконтроллерные проекты со схемами и печатными платами выполненными в этой программе.  Очень рекомендую! ( краткое руководство по EAGLE накрапал на русском
    )

    Еще :

    DipTrace  - очень приятная в работе  программа! Чудесно разводит платы в автоматическом режиме.

    ЛУТ    или Лазерно - Утюжный метод изготовления печатной платы 

    1) Рисунок печатной платы ЗЕРКАЛЬНО печатаю на глянцевой стороне "Универсальной бумаги для струйной печати" LOMOND - глянцевая-матовая двухсторонняя 50 листов А4, вес 170 гр/м2  (на торце пачки и над штрих-кодом номер 0102009) с обычными настройками принтера HP LaserJet 6P. Можно использовать испорченные, неудачные фотографии.

    К рисунку платы можно добавить изображение рамки большей чем контур заготовки платы примерно на 1 мм с каждой стороны - так будет легко правильно совместить рисунок и плату. Или сделать в плате 2 (или больше) отверстия диаметром 3-4 мм, измерить РЕАЛЬНОЕ расстояние между ними и нанести на рисунок платы соответствующие перекрестия-прицелы для точного визуального совмещения рисунка с платой. Это полезно при изготовлении двухсторонних плат.

    2) Медь платы я шкурю шкуркой с зерном 300-500 в перекрестных направлениях, затем стираю пыль тампоном из бинта. Не касайтесь поверхности платы пальцами! 

    3) Положите на ровную УСТОЙЧИВУЮ поверхность:
     
    - упругий, ровный материал типа коврика мыши или листовой жесткий упаковочный мелкопористый поролон (я использовал 20 мм) 
    - 2 листа бумаги А4 
    - рисунок ЗЕРКАЛЬНЫЙ платы тонером вверх !!! 
    - плату положите на рисунок КОНЕЧНО медью к тонеру, для центровки используйте прозорливо напечатанные контуры или отверстия в плате совмещаемые с перекрестиями на рисунке.
    - если плата большая, то для более равномерного распределения нагрузки и тепла положите сверху еще 2-4 заготовки для плат.
    - лист бумаги А4 чтоб не коцать подошву утюга. 
    - утюг ХОЛОДНЫЙ !!! 
    - груз на утюг - я кладу 2 кГ сахара в мешках на плату 60х80.

    Центр тяжести утюга с грузом должен быть примерно по центру заготовки платы, чтоб стоял устойчиво без перекоса - тогда рисунок будет равномерно прижат к меди. 

    4)  Моё ноу-хау в этом методе, возможно и позволяющее уверенно получать дорожки 0.1 мм - НЕ  НАДО  ТОРКАТЬ  ГОРЯЧИЙ 
    УТЮГ  ТУДА-СЮДА ! 
     Вы просто отходите в сторонку от этого "пирога" и нежно включаете утюг в розетку. Он нагревается и сам выключается-включается терморегулятором. Регулятор утюга я ставлю на "3" - у моего утюга это 120-130 градусов всего.  (я использую принтер HP LJ 6P - его тонеру этого достаточно). Не нужно греть сильней

    После первого автоматического отключения нагрева я жду 5 минут, выключаю утюг из розетки. Оставляю установку минут на 20-30, что бы "пирог" остыл ниже температуры плавления тонера. Теперь можно снять утюг.

    5) Плату с фотобумагой положите в теплую воду. Примерно через 3-5 минут она намокнет и по краям отойдет от платы. Не спешите! Я оставляю на 30 минут "изделие". После этого бумага уже хорошо отделяется от фотослоя, который вживляется в поры тонера. Таким образом весть тонер покрыт фотослоем, его поры закрыты и при травлении дорожки получаются не изъеденными раствором.

    К сожалению именно фотослой не дает делать зазоры менее 0.2 мм - он намертво заседает в маленьких зазорах и не желает от туда вымываться. Однако после высыхания фотослой легко вычищается из зазоров иголкой. Остатки бумаги и фотослоя скатываются пальцами в воде - но их бывает мало и лишь в нескольких местах.

    6) После высыхания платы внимательно с линзой проверьте рисунок платы на наличие дефектов. Особенно фотослой в узких местах между тонером. Подретушируете при необходимости рисунок нитро-лаком (мебельный НЦ222, цапон, лак для ногтей) и кисточкой от лака для ногтей или зубочисткой.

    7) Травлю, после высыхания ретуши, в хлорном железе в пластиковой емкости - свежий раствор работает быстрее, не грею. 

    удобно: Прикрепляю пенопласт к обратной стороне платы и плата плавает в хлорном железе травящейся стороной вниз - таким образом шлам от травления не оседает на плате а опускается на дно емкости и не препятствует травлению! Пенопласт является ручкой за которую его удобно вынимать для визуального контроля процесса травления.  

    Проверяйте процесс чаще !  Не передерживайте в растворе для уменьшения бокового подтрава узких дорожек!

    8) Хорошо промойте плату проточной водой и смойте тонер растворителем, еще раз пошкурьте медь мелкой шкуркой, просушите плату.

    Вот пример платы с дорожками 0.15 мм изготовленной по описанной технологии под программатор-отладчик для микроконтроллеров PIC ICD2

     Линки на такие устройства на русском языке
    есть в низу заглавной страницы курса.

     

    9) Я залуживаю всю медь платы паяльником с припоем предварительно смазав ватной палочкой медь активным флюсом. Плату держу сильно наклонно и веду жало паяльника всегда вниз от контактных площадок, чтоб на контактных площадках не скапливался припой!

    Вот и все!   

     

    Чем и как "прошить" МК AVR ?
    Как загрузить программу в микроконтроллер.
    Как запрограммировать микроконтроллер AVR.

     

    Напоминаю: Об основах и тонкостях электроники и схемотехники читайте в настольной книге электронщика:  П.Хоровиц, У.Хилл. Искусство схемотехники на РУССКОМ языке.   

    Я советую прошивать микроконтроллер прямо из программатора встроенного в компилятор CodeVisionAVR через простейший адаптер - буквально "пять проводков" соединяющих принтерный порт ПК с прошиваемым микроконтроллером AVR.

    ПОДРОБНО: Результат написания и компиляции программы - файл-прошивку с расширением .hex (и возможно файл с содержимым для
    EEPROM
    МК) нужно записать ("зашить") в МК .
    МК AVR многократно программируются прямо в устройстве в котором будут работать - такое программирование называют - "ин систем программинн" или ISP. 

    Для этого установите на плате вашего устройства 6 контактов,  а лучше 6-ти штырьковый разъем для ISP

    вид сверху платы на штырьки. 
    выводы подсоединить к МК в соответствии с указанными названиями.

    Подробней по ISP разъемам посмотрите Апликейшн Ноут AVR910


    Вывод 2 нужно подключить к
    +
    питания МК если вы собираетесь использовать программатор питающийся от вашего же устройства - например фирменный ISP AVR. 

    Для "5 проводов" этот вывод не подключается. Для программирования достаточно 5 контактов. Соответственно и разъем который вы будете использовать может быть любым удобным для размещения на плате и имеющий минимум 5 контактов. Все контакты ISP разъема подсоединяются к  ножкам  МК в соответствии с названиями.

         
     

    ВНИМАНИЕ !  в ATmega64 и ATmega128 выводы MOSI и MISO не применяют для ISP  Внимательно смотрите ДатаШит !     Например для ATmega128 сигналы MISO подключают к ножке PE1,  MOSI подключают к ножке PE0

     
         


    Я советую вам пользоваться  интерфейсом программирования встроенным в компилятор CodeVisionAVR и конечно же в нем разрабатывать программу для МК.  Дело в том, что вам вряд ли удастся сразу написать программу без ошибок, даже после прогона в софт эмуляторе - симуляторе ваше устройство может делать не то,  что вы от него ожидаете - значит в программу нужно будет вносить изменения и снова зашивать в МК , и так раз 20 и более.  

    Вы можете в компиляторе CodeVisionAVR открыть меню "Проджект -> Конфига -> Афта Мэйк"  и отметить чек бокс  "Program the chip" затем ОК. Еще нужно в меню "Сеттинс  -> Программер" выбрать ваш адаптер (подробней ниже) для программирования. Теперь после безошибочной компиляции программы вам будет доступна кнопка "Program" - нажмите на нее и произойдет программирование МК - т.е. файл .hex будет загружен в память программ МК. Затем МК будет "сброшен" (на ножку RESET будет подан лог. 0 а затем опять "1") и начнет выполнять только что прошитую (загруженную в него) программу. Вам даже не нужно будет отсоединять адаптер программирования от вашего устройства  если вы не используете в устройстве последовательный интерфейс SPI.  ... и так до окончательной отладки устройства.

         
     

    В А Ж Н О !  В диалоге настройки программирования не трогайте галочки установки фьюзов МК если не разобрались четко что они делают! Иначе вы можете отключить режим ISP или внутренний RC-генератор и для следующего программирования вам понадобится ставить кварц с конденсаторами или даже искать Параллельный программатор для AVR. Но популярному ATtiny2313 даже параллельный программатор не поможет!  

     
         

    в ATmegaXXX с завода включен внутренний RC генератор на  частоте 1 МГц   ( уточните это по ДШ  и его возможные частоты ) Если вам нужна другая частота или нужно включить внешний кварцевый или керамический резонатор - вам нужно запрограммировать некоторые фьюзы по таблицам из ДШ или по таблице фьюзов на стр. 2

    З а п о м н и т е : 

    • НЕ запрограммированный  фьюз        1

    • ЗАпрограммированный   фьюз             0

    Пример: Чтобы включить в ATmega16 внешний кварцевый резонатор с частотой от 3 до 8 МГц с конденсаторами (по схеме рис. 12 ДШ) найдите в ДШ раздел "System Clock".

    В таблице 2 указаны комбинации фьюзов для разных источников тактового сигнала. Далее написано что с завода МК поставляется с такой комбинацией фьюзов

    SKSEL   0001     SUT  10       CKOPT   1


    По таблице 4  находим :

    Для кварца с частотой от 3 до 8 МГц 
    нужны конденсаторы от 12 до 22 пФ и  вот  такая  комбинация  фьюзов :

    SKSEL   1111     SUT  10       CKOPT   1

    Установка фьюзов в программаторе компилятора  CVAVR


    Для прошивания МК нажмите кнопку "Program All"

    Для использования ATmega16 (и других мег) с внешним кварцевым или керамическим резонатором на частотах выше 8 МГц вам нужно установить фьюзы как в примере выше но запрограммировать CKOPT  - значит сделать его "0". Т.е. вам нужна такая комбинация:

    SKSEL   1111     SUT  10       CKOPT   0

    CKOPT   - нужен и тогда когда вы хотите подключить к XTAL2 другой микроконтроллер или тактируемый прибор.

    Фьюзы  SUT   - определяют запуск генератора тактового сигнала, в большинстве случаев их установку можно оставить "как с завода"  -   SUT  10   -  более детально это описано в даташите в таблицах до 12.
      Для соединения компьютера с ISP разъемом устройства на AVR Советую сделать адаптер от STK200  - это "правильные 5 проводков" с микросхемой буфером снижающим вероятность случайного повреждения порта ПК. В установках компилятора CodeVisionAVR интерфейс "5-проводков" называется  "Канда системз STK200+/300"



    Программа узнаёт адаптер STK200 по перемычкам на разъеме параллельного порта к которому он подключается - должны быть соединены двумя перемычками пары выводы: 2 и 12,  3  и 11. 

     

         
     

    Внимание!   Для программирования к МК должно быть подключено питание. Например +4...+5 вольт ко всем выводам МК в названии которых есть VCC  и 0 вольт ко всем выводам GND (это "общий" провод).     Пример тут

     
         

    Если в МК нет внутреннего генератора тактового сигнала (например старые AVR серии AT90sXXXX или мега побывавшая в чьих то шаловливых руках изменивших фьюзы до того как попасть к вам) то нужно подключить кварц  на 1 - 8 МГц и два конденсатора от 15 до 33 пФ. Либо подать тактовый сигнал 1-1.5 МГц от внешнего источника - например генератора на микросхеме 74hc14 или на таймере LM555.

    Программатор  AVReAl  может программировать МК без кварца и без конденсаторов. Он выводит тактовый сигнал на выв. 5 LPT его нужно подать на ножку XTAL1 МК и добавить в командной строке AVReAL специальный ключ  "-o0".  Программатор  AVReAl  позволяет назначать какие ножки LPT порта использовать - это будет полезно когда часть ножек LPT вы уже спалите   :-)

    (Тактовый сигнал генерирует и программатор на USB по ссылке внизу этой страницы.)

     Еще очень советую поставить подтягивающий резистор 10 кОм от ножки Reset МК на питание VCC и конденсатор 0.01-0.33 мкФ (в апноутах AVR040 и AVR042 рекомендуют 0.01 мкФ) от Reset на GND  -  как в схеме к задаче 7 курса.

     

         
     

    Я использую самый простой вариант адаптера STK200 - "для самых ленивых"   - пять поводков соединяющих линии параллельного (LPT) порта ПК и AVR так же как на схеме STK200 выше, но без микросхемы буфера. Лучше все же токоограничительные резисторы от 150 до 270 ом впаять Проводки не более 15 см длиной !

     
         

     

     



    Адаптер "5-проводков" прекрасно работает с компилятором CodeVision

         
     

    Советую для изготовления адаптера взять " принтерный" шнур - он длинный и экранированный, а не экранированные проводки не стоит делать более 10-15 см.

     
         

     
    Для питания устройства при программировании и отладке можно кроме сетевого адаптера использовать: 

    • - батарейку на 6 вольт с 2 диодами последовательно для понижения напряжения...

    • - можно три батарейки по 1,5 вольт последовательно соединить 

    • ... а можно +5 вольт взять с вывода 1 гейм порта компьютера или осторожно из гнезда USB.

    Желательно питать устройство от ПК!  В этом случае "земля" вашего устройства будет соединена с корпусом ПК и можно будет безопасно подключать и отключать разъем программирующего адаптера.

         
     

    ВНИМАНИЕ!  Всегда старайтесь первыми соединить "земли" устройств, а затем питание и потом уже сигнальные линии.

     
         


    Не поленитесь:  спаяйте адаптер STK200 на микросхеме буфере по рисункам внизу страницы  - так как LPT порт компьютера более нежен чем COM - соответственно его спалить проще...   

     

         
     

    Если вы хотите использовать ножки МК SCK, MOSI, MISO в вашем устройстве то подключайте другие компоненты к ним через резисторы 4.7 КОм - чтобы не мешать программированию. Так рекомендовано в апноуте AVR042 Для Мега64, -128, -256 вместо MOSI и MISO используются другие ножки для ISP программирования !

     
         

    Если у вас нет LPT порта сделайте Аналог  "5 проводков" для COM-порта

    Или соберите простой, дешевый USB программатор для AVR

    Или соберите похожий программатор USB  программатор AVR и AT89s

    Вот топик об успешной сборке этого интерфейса для программирования на ATmega8. Это новый вариант платы для него. Архив с разводкой платы Внимание !  Этот программатор выдает тактовый сигнал 1 МГц и меньше для прошивки МК без кварца и с выключенным внутренним генератором. тактовый сигнал выводится на контакт "LED". Его нужно подвести к ножке XTAL1.

         
     

    Существуют специальные программы "бутлодеры" которые записываются в микроконтроллер способами перечисленными выше и после этого микроконтроллер может сам, при включении, закачивать в себя программу (например из ПК через адаптер UART rs232 COM port - схема в задаче 4 курса) и запускать ее выполнение. Есть много бесплатных загрузчиков

     
         

     

    Программатор AVR микроконтроллеров. LPT программатор.

    Кликни чтобы увеличить
     
    Принципиальная схема программатора на LPT порт показана на рисунке. В качестве шинного формирователя используется микросхема 74HC244 (К1564АП5), 74LS244 (К555АП5) либо 74ALS244 (К1533АП5), хотя может использоваться любой другой неинвертирующий шинный формирователь с тремя состояниями (в этом случае может потребоваться соответствующее изменение схемы).

    Светодиод VD1 индицирует режим записи микроконтроллера,
    светодиод VD2 - чтения,
    светодиод VD3 - наличие питания схемы.

    Напряжение, необходимое для питания схема берёт с разъёма ISP, т.е. от программируемого устройства. Эта схема является переработанной схемой программатора STK200/300 (добавлены светодиоды для удобства работы), поэтому она совместима со всеми программами программаторов на PC, работающих со схемой STK200/300. Для работы с этим программатором используйте программу CVAVR


    Программатор можно выполнить на печатной плате и поместить её в корпус разъёма LPT, как показано на рисунках:

    Для работы с программатором удобно использовать удлинитель LPT порта, который несложно изготовить самому (к примеру, из кабеля Centronix для принтера), главное "не жалеть" проводников для земли (18-25 ноги разъёма) или купить. Кабель между программатором и программируемой микросхемой не должен превышать 20-30 см.

    Файлы:

     

    AVR miniICE -  

    Это профессиональное средство для программирования и  отладки программы МК ATmega фирмы Atmel в реальном устройстве. Он полностью совместимый с оригинальным AVR JTAG ICE.

    Автор данного устройства Milan Kostomlatsky kosta@mcu.cz
    Оригинальное описание находится здесь

    Пример реализации: на макетке

    - стр. 8 -
    Дополнительные материалы:

     

    Platan.ru  Рускоязычный сайт с морем информации по любым электронным  компонентам  там же: цены, DataSheet и заказы р-деталей почтой по России.  Можете бесплатно заказать CD-ROM'ы с документацией ведущих производителей компонентов.
     

    Интересный AVR сайт: Sin-bad.narod.ru с информацией по AVR для начинающих и русским описанием архитектуры этих МК, приемы программирования, документация.

    В разделе "AVR документация" рекомендую пункты 5,6,9,10,13  - это переводы фирменых атмеловских Application Notes ссылка на оригинал которых находится ниже по тексту. 

    Советую скачать и прочитать внимательно:  "серия из 11 статей по МК опубликованых в журнале "СхемоТехника" под общем названием: Микроконтроллеры? Это же просто! - подробно рассказывается о том что же такое микроконтроллер и как с ним работать"  автор А. Фрунзе - много пишет для начинающих в различных журналах - в низу страницы.


    СОВЕТУЮ: будет время - скачайте и прочитайте 4 статьи из журнла Circuit Cellar (очень ценный журнал по электронным самоделкам на профессиональном уровне) о применении в достаточно серьезных проектах компилятора Си  ICC AVR:

    Цитата:

    Circuit Cellar magazine publishes many articles that use the ImageCraft compilers. Here are some that are using especially helpful for ICCAVR users, from beginners to advanced users:

    1. Taking a Swim with Atmel's STK500

    2. Still Swimming With the STK500, Onto the JTAG ICE

    3. Design with STKxxx, Build an Ethernet Controller

    4. Construct an ATA Hard Drive Controller

    По ссылкам ищите "Соусыз и пдф" и скачивайте .pdf файлы статей, там же есть ссылки на прилагаемые "исходники" к статьям.


    Здесь все публикации журнала с 1988 года - некоторые в свободном доступе.

    Базовые знания по Электронике можно получить здесь:

    • 1) Basic Electronics Theory 

    • 2) Analog Dialogue - Крупнейший производитель компонентов публикует теоретические сведения для электронщиков - все прекрасно рассказано, с картинками и бесплатно!  

     

    Профессиональные разработчики обычно используют для отладки устройство: AVR JTAG ICE. подробную информацию и документацию смотрите на сайте производителя. стоит устройство под сотню баксов и позволяет отлаживать программу прямо в реально изготовленном, работающем устройстве. Вы можете за меньшие деньги сделать AVR JTAG ICE самостоятельно

    Я тоже обычно отлаживаю программу прямо в реально изготовленном, работающем устройстве. при помощи адаптера и способа описанных в задаче 4 курса. 

     

    Полезные ссылки и нформация ниже

    Название

    Авторы

    Источник

    Скачать

    Исходник для работы с DS190A (ключ-микросхема индентификации от DALLAS)

    Конышев Ю.А.

     

    Исходник для работы с LCD (1 строка на 16 символов) с подключением по 8-х битному интерфейсу

    Конышев Ю.А.

     

    Исходник для работы с LCD (1 строка на 16 символов) с подключением по 4-х битному интерфейсу

    Конышев Ю.А.

     

    Пример (в Excel) расчета значения регистров перезагрузки таймеров/счетчиков для определения скорости UART1 в C8051F120

    Конышев Ю.А.

     

    Пример (в Excel) расчета значения регистров перезагрузки таймеров/счетчиков для определения скорости UART0 в C8051F120

    Конышев Ю.А.

     

    Пример (в Excel) расчета значения регистра SPI0CKR для определения скорости интерфейса SPI0 в C8051F120

    Конышев Ю.А.

     

    Пример (в Excel) расчета значения регистра SMB0CR для определения скорости интерфейса SMBus в C8051F120

    Конышев Ю.А.

     

    Пример - считывание 26-ти и 34-х битных кодов карт посредством 4-х Proximity считывателей (HID, PW, EM-Marin и др.) и управление исполнительными устройствами. Используется C8051F226 с вводом/выводом д

    Конышев Ю.А.

     

    Библиотека временных задержек для микроконтроллеров Silabs рассчитанных для тактовой частоты равной 24мГц

    Конышев Ю.А.

     

    Библиотека временных задержек для микроконтроллеров Silabs рассчитанных для тактовой частоты равной 11,059мГц

    Конышев Ю.А.

     

    Пример работы c датчиком температуры DS18B20 с выводом результата на LCD (измерение температуры, эксперементы с интерфейсом 1-Wire)

    Конышев Ю.А.

     

    Пример работы c АЦП (ADC0) в C8051F330 с выводом результата на LCD (измерение напряжения на входе АЦП и температуры кристала микроконтроллера со встроенного датчика TempSensor)

    Конышев Ю.А.

     

    Пример работы c АЦП (ADC0) в C8051F330 с выводом результата на LCD (измерение напряжения на входе АЦП)

    Конышев Ю.А.

     

    Руководство программиста по созданию USB Mass Storage приборов ("AN282SW.ZIP")

    Silicon Laboratories

    www.silabs.com

    Руководство программиста по созданию USB Mass Storage приборов ("AN282: USB Mass Storage Device Reference Design Programmer's Guide")

    Silicon Laboratories

    www.silabs.com

    Примеры реализации голосового рекодера на микроконтроллере C8051F41x (Voice_Recorder)

    Silicon Laboratories

    www.silabs.com

    Примеры реализации голосового рекодера на микроконтроллере C8051F41x (Voice_Recorder)

    Silicon Laboratories

    www.silabs.com

    Оптимизация и расчет энергопотребления в малогабаритных микроконтроллерах серий С8051F30x и С8051F31x (Power Management Techniques for the 'F30x and 'F31x)

    Silicon Laboratories

    www.silabs.com

    Оптимизация и расчет энергопотребления в малогабаритных микроконтроллерах серий С8051F30x и С8051F31x (Power Management Techniques for the 'F30x and 'F31x)

    Silicon Laboratories

    www.silabs.com

    Руководство по переходу с С8051F02x на С8051F12x (Porting Considerations from F02x to 'F12x)

    Silicon Laboratories

    www.silabs.com

    Руководство по переходу с С8051F02x на С8051F12x (Porting Considerations from F02x to 'F12x)

    Silicon Laboratories

    www.silabs.com

    Использование банков памяти программ для расширения адресного пространства в компиляторе Keil 8051 (Code Banking Using the Keil 8051 Tools)

    Silicon Laboratories

    www.silabs.com

    Использование банков памяти программ для расширения адресного пространства в компиляторе Keil 8051 (Code Banking Using the Keil 8051 Tools)

    Silicon Laboratories

    www.silabs.com

    Руководство пользователя по эволюционному комплекту DTMF-RD (DTMF-RD User's Guide)

    Silicon Laboratories

    www.silabs.com

    Реализация DTMF декодера на базе микроконтроллера C8051F300 (DTMF Decoder Reference Design)

    Silicon Laboratories

    www.silabs.com

    Реализация функций самопрограммирования и внутрисхемного программирования flash-памяти в микроконтроллерах C8051Fxxx (Production Programming Options for Silicon Labs Devices)

    Silicon Laboratories

    www.silabs.com

    Функции быстрого преобразование Фурье для семейства быстродействующих микроконтроллеров C8051F12x (FFT Routines for the C8051F12x Family)

    Silicon Laboratories

    www.silabs.com

    Функции быстрого преобразование Фурье для семейства быстродействующих микроконтроллеров C8051F12x (FFT Routines for the C8051F12x Family)

    Silicon Laboratories

    www.silabs.com

    Программная реализация SPI-интерфейса в микроконтроллерах C8051F30x (Software SPI Examples for the C8051F30x Family)

    Silicon Laboratories

    www.silabs.com

    Программная реализация SPI-интерфейса в микроконтроллерах C8051F30x (Software SPI Examples for the C8051F30x Family)

    Silicon Laboratories

    www.silabs.com

    Руководство разработчика приложений с TCP/IP с использованием библиотеки TCP/IP Library (TCP/IP Library Programmer's Guide)

    Silicon Laboratories

    www.silabs.com

    Руководство разработчика приложений с TCP/IP с использованием библиотеки TCP/IP Library (TCP/IP Library Programmer's Guide)

    Silicon Laboratories

    www.silabs.com

    Руководство по реализации ZigBee интерфейса на базе микроконтроллера C8051F121 (2.4 GHZ ZIGBEE™ DEMONSTRATION USER’S GUIDE)

    Silicon Laboratories

    www.silabs.com

    Конфигурирование и использование выводов GPIO.x в качестве линий ввода/вывода специального назначения (Port Configuration and GPIO for CP210x)

    Silicon Laboratories

    www.silabs.com

    Конфигурирование и использование выводов GPIO.x в качестве линий ввода/вывода специального назначения (Port Configuration and GPIO for CP210x)

    Silicon Laboratories

    www.silabs.com

    Установка параметров и работа с преобразователями интерфейсов CP210x в среде Visual Studio 6.0. (CP210x Device Customization Guide)

    Silicon Laboratories

    www.silabs.com

    Руководство по написанию программного обеспечения для передачи данных с использованием преобразователей интерфейсов CP210x в среде WinAPI (Serial Communications Guide for CP210x)

    Silicon Laboratories

    www.silabs.com

    Руководство по написанию программного обеспечения для передачи данных с использованием преобразователей интерфейсов CP210x в среде WinAPI (Serial Communications Guide for CP210x)

    Silicon Laboratories

    www.silabs.com

    Создание драйверов для микроконтроллеров C8051F32x и преобразователей интерфейсов CP210x в среде Windows c использованием USB Express (C8051F32x and CP210x USB Driver Customization)

    Silicon Laboratories

    www.silabs.com

    Создание драйверов для микроконтроллеров C8051F32x и преобразователей интерфейсов CP210x в среде Windows c использованием USB Express (C8051F32x and CP210x USB Driver Customization)

    Silicon Laboratories

    www.silabs.com

    Описание и работа сигма-дельта АЦП в микроконтроллерах семейства C8051F35x (C8051F35x Delta-Sigma ADC User's Guide)

    Silicon Laboratories

    www.silabs.com

    Программирование flash-памяти по 2-проводному интерфейсу С2 (FLASH Programming via the C2 Interface)

    Silicon Laboratories

    www.silabs.com

    Программирование flash-памяти по 2-проводному интерфейсу С2 (FLASH Programming via the C2 Interface)

    Silicon Laboratories

    www.silabs.com

    Особенности организации внутрисхемного программирования по интерфейсу C2 на целевой плате (Pin Sharing Techniques for the C2 Interface)

    Silicon Laboratories

    www.silabs.com

    Руководство по работе с библиотекой USBXpress в WinAPI для микроконтроллеров C8051F32x и CP210x (USBXpress Development Kit User's Guide)

    Silicon Laboratories

    www.silabs.com

    Руководство по работе с библиотекой USBXpress в WinAPI для микроконтроллеров C8051F32x и CP210x (USBXpress Development Kit User's Guide)

    Silicon Laboratories

    www.silabs.com

    Оптимизация работы с памятью программ в микроконтроллерах серии C8051F12x для достижения производительности до 100 MIPS (Cache Optimizations for C8051F12x) Silicon Laboratories www.silabs.com

    Silicon Laboratories

    www.silabs.com

    Оптимизация работы с памятью программ в микроконтроллерах серии C8051F12x для достижения производительности до 100 MIPS (Cache Optimizations for C8051F12x)

    Silicon Laboratories

    www.silabs.com

    Реализация функций самопрограммирования flash-памяти микроконтроллера (Writing to FLASH from Application Code)

    Silicon Laboratories

    www.silabs.com

    Реализация функций самопрограммирования flash-памяти микроконтроллера (Writing to FLASH from Application Code)

    Silicon Laboratories

    www.silabs.com

    Использование ЦАП в качестве генератора сигналов сложной формы (Using the DAC as a Function Generator)

    Silicon Laboratories

    www.silabs.com

    Использование ЦАП в качестве генератора сигналов сложной формы (Using the DAC as a Function Generator)

    Silicon Laboratories

    www.silabs.com

    Примеры простых программ на языке Си для микроконтроллеров C8051F02x (Annotated 'C' examples for the 'F02x Family)

    Silicon Laboratories

    www.silabs.com

    Примеры простых программ на языке Си для микроконтроллеров C8051F02x (Annotated 'C' examples for the 'F02x Family)

    Silicon Laboratories

    www.silabs.com

    Использование Interface Utilities DLL в среде WinAPI для работы с интерфейсом отладки (Using C8051Fxxx On-Chip Interface Utilities DLL)

    Silicon Laboratories

    www.silabs.com

    О защите данных в flash-памяти от случайного и преднамеренного изменения/считывания (Flash Securities User's Guide)

    Silicon Laboratories

    www.silabs.com

    О необходимой минимальной задержке с момента переключения каналов АЦП до начала преобразования (Calculating Settling Time For Switched Capacitor ADC's)

    Silicon Laboratories

    www.silabs.com

    Методика увеличения разрешающей способности АЦП путем передискретизации и усреднения (Improving ADC Resolution by Oversampling and Averaging)

    Silicon Laboratories

    www.silabs.com

    Методика увеличения разрешающей способности АЦП путем передискретизации и усреднения (Improving ADC Resolution by Oversampling and Averaging)

    Silicon Laboratories

    www.silabs.com

    Руководство пользователя для эволюционной платы USB FM Radio

    Silicon Laboratories

    www.silabs.com

    Исходные коды для эволюционной платы USB FM Radio

    Silicon Laboratories

    www.silabs.com

    Техническое описание эволюционной платы USB FM Radio

    Silicon Laboratories

    www.silabs.com

    Примеры для UART (Software UART Examples)

    Silicon Laboratories

    www.silabs.com

    Примеры для UART (Software UART Examples)

    Silicon Laboratories

    www.silabs.com

    Передача данных по последовательному интерфейсу SMBus/I2C в микроконтроллерах C8051F0xx (Serial Communication with the SMBus)

    Silicon Laboratories

    www.silabs.com

    Передача данных по последовательному интерфейсу SMBus/I2C в микроконтроллерах C8051F0xx (Serial Communication with the SMBus)

    Silicon Laboratories

    www.silabs.com

    Реализация функций самопрограммирования flash-памяти с загрузкой кода по интерфейсу UART для микроконтроллеров С8051F02x и С8051F30x (UART In-Application Code Loading Examples)

    Silicon Laboratories

    www.silabs.com

    Реализация функций самопрограммирования flash-памяти с загрузкой кода по интерфейсу UART для микроконтроллеров С8051F02x и С8051F30x (UART In-Application Code Loading Examples)

    Silicon Laboratories

    www.silabs.com

    Использование таймеров в режиме ШИМ (16-Bit PWM Using an On-Chip Timer)

    Silicon Laboratories

    www.silabs.com

    Использование таймеров в режиме ШИМ (16-Bit PWM Using an On-Chip Timer)

    Silicon Laboratories

    www.silabs.com

    Использование таймера T2 для реализации часов реального времени (RTC) (Implementing a Real-Time Clock)

    Silicon Laboratories

    www.silabs.com

    Использование таймера T2 для реализации часов реального времени (RTC) (Implementing a Real-Time Clock)

    Silicon Laboratories

    www.silabs.com

    Программные методы расширения разрешающей способности ШИМ с использованием программируемого массива счетчиков (PCA) в качестве генератора сигналов ШИМ. (Implementing 16-Bit PWM Using the PCA)

    Silicon Laboratories

    www.silabs.com

    Программные методы расширения разрешающей способности ШИМ с использованием программируемого массива счетчиков (PCA) в качестве генератора сигналов ШИМ. (Implementing 16-Bit PWM Using the PCA)

    Silicon Laboratories

    www.silabs.com

    Подключение внешней статической памяти (Interfacing an External SRAM to the C8051Fxxx)

    Silicon Laboratories

    www.silabs.com

    Подключение внешней статической памяти (Interfacing an External SRAM to the C8051Fxxx)

    Silicon Laboratories

    www.silabs.com

    О программировании Flash-памяти микроконтроллеров по интерфейсу JTAG (Programming FLASH through the JTAG Interface)

    Silicon Laboratories

    www.silabs.com

    О программировании Flash-памяти микроконтроллеров по интерфейсу JTAG (Programming FLASH through the JTAG Interface)

    Silicon Laboratories

    www.silabs.com

    О встраивании компилятора Keil C в интегрированную среду разработки SiLabs IDE (Integrating Keil 8051 Tools into the Silicon Labs IDE)

    Silicon Laboratories

    www.silabs.com

    Об использовании встроенного температурного датчика (Using the On-Chip Temperature Sensor)

    Silicon Laboratories

    www.silabs.com

    Об использовании встроенного температурного датчика (Using the On-Chip Temperature Sensor)

    Silicon Laboratories

    www.silabs.com

    Примеры настройки параметров внутреннего и внешнего тактовых генераторов (Configuring the Internal and External Oscillators)

    Silicon Laboratories

    www.silabs.com

    Примеры настройки параметров внутреннего и внешнего тактовых генераторов (Configuring the Internal and External Oscillators)

    Silicon Laboratories

    www.silabs.com

    Пример конфигурации портов ввода-вывода с использованием Crossbar (Configuring the Port I/O Crossbar Decoder)

    Silicon Laboratories

    www.silabs.com

    Пример конфигурации портов ввода-вывода с использованием Crossbar (Configuring the Port I/O Crossbar Decoder)

    Silicon Laboratories

    www.silabs.com

    Исходный файл для работы с символьными LCD

    О.Николайчук

     

     

     

    Осваиваем
    Микроконтроллеры AVR
    Рюмик С.М.

    (pdf, 1,631 Mb)

    Современные счетчики электроэнергии

    (djvu, 12.99 Мб )

    Современные цифровые мультиметры

    (djvu, 19,507 Mb)

    Собери САМ 55
    КИТ выпуск №1

    Собери САМ 60
    КИТ выпуск №2

    Собери САМ 65
    КИТ выпуск №3

    Программный ремонт
    сотовых телефонов

    (djvu, 13,6 Mb)

    Патрик Гёлль
    Мобильные телефоны и ПК

    (djvu, 5,4 Mb)

    Адаменко М. В.
    Мобильные телефоны и ПК

    (djvu, 8,8 Mb)

    Силовая электроника, 2006

    Книга доступна на DVD

    Журналы:

    РадиоХобби 2006 № 1, 2, 3, Радио, Схемотехника, Радиоаматор, Ремонт электронной техники и др. доступны в файловом архиве

    http://radiodvd.mylivepage.ru

    Турута Е.Ф. "Активные SMD комоненты" 33000 кодов, 2006г.

    Турута Е.Ф. "Активные SMD комоненты" 33000 кодов, 2006г.

    Книга доступна на DVD

    101 способ хищения электроэнергии

    В.В. Красник
    101 способ хищения
    электроэнергии
    Скачать

    Вольфганг Трамперт
    Измерение, управление и регулирование с помощью AVR микроконтроллеров.
    Скачать